私が読んだところでは、エクスポートが行うのは、変数を子プロセスに見せることだけだと仮定するのは正しいですか?bashで、変数を作成するとき。輸出する時期と輸出しない時期
変数を初期化されたスコープでのみ表示したい場合や、すべての子スコープで変数を使用できるようにするシナリオは何ですか?
私が読んだところでは、エクスポートが行うのは、変数を子プロセスに見せることだけだと仮定するのは正しいですか?bashで、変数を作成するとき。輸出する時期と輸出しない時期
変数を初期化されたスコープでのみ表示したい場合や、すべての子スコープで変数を使用できるようにするシナリオは何ですか?
一般に、の別のプロセスがその環境内で検索する変数をエクスポートするだけで済みます。それらの変数がどのように分かっていますか?彼らのドキュメントを読む必要があります。
変数がエクスポート用にマークされているかどうかにかかわらず、は現在のシェルとの違いがありません。
デモンストレーションを構築しましょう。 (現在のシェル)その親プロセスがfoo
をエクスポートしていなかったので、
$ printf 'echo "foo=$foo"\n' > script
$ bash script
foo=
$ foo=3
$ bash script
foo=
$ export foo
bash script
foo=3
初めてとあなたがscript
を実行二回目は、foo
は、その環境の中で定義されていません。 3回目に呼び出されると、foo
がエクスポートされたため、親はスクリプトの初期環境にfoo
を追加します。
「環境」という用語は非常に正確な意味を持っています。 すべてプロセスは、シェルだけでなく、スタートアップ時にその環境と呼ばれる親から文字列の配列を受け取ります。これらの文字列には特別なセマンティクスはありません。受け取り側のプログラムにどのように解釈させるかは、受講者の責任です。
たとえば、シェルでは、name=value
という形式の文字列は無視されます。ここで、name
は有効なシェル識別子です。このような文字列ごとに、シェルは与えられた名前と値でシェル変数を定義し、そのエクスポート属性をマークします。これが環境変数の意味です。 export
コマンドを使用して、通常のシェル変数をいつでも環境変数に「昇格」することもできますが、現在のプロセスの変数の意味には影響しません。
プロセスが新しいプロセスを作成すると、そのプロセスの環境のコピーが新しいプロセスに与えられます。シェルはさらに、それぞれの環境変数から渡す文字列をname=value
作成します。
範囲!=処理。シェル変数は、エクスポートすることなく、同じプロセス内のすべての子スコープで使用できます。 – chepner
@chepner Gotcha。だから、輸出はどうやって動くのだろう? – vkapustin