2016-04-27 5 views
0

私が読んだところでは、エクスポートが行うのは、変数を子プロセスに見せることだけだと仮定するのは正しいですか?bashで、変数を作成するとき。輸出する時期と輸出しない時期

変数を初期化されたスコープでのみ表示したい場合や、すべての子スコープで変数を使用できるようにするシナリオは何ですか?

+1

範囲!=処理。シェル変数は、エクスポートすることなく、同じプロセス内のすべての子スコープで使用できます。 – chepner

+0

@chepner Gotcha。だから、輸出はどうやって動くのだろう? – vkapustin

答えて

2

一般に、の別のプロセスがその環境内で検索する変数をエクスポートするだけで済みます。それらの変数がどのように分かっていますか?彼らのドキュメントを読む必要があります。

変数がエクスポート用にマークされているかどうかにかかわらず、は現在のシェルとの違いがありません。

デモンストレーションを構築しましょう。 (現在のシェル)その親プロセスが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作成します。

+0

ありがとう!これはより意味をなさないようになっています。私はまだシェルと環境の違いを理解するのに苦労しています。 osxで端末を開くと、私は新しい環境を開いていますか? – vkapustin

+0

子プロセスだけがエクスポートされた変数にアクセスすることができるので、私は「別のプログラム」とは言いませんが、任意の他のプログラムは確かにありません。 – Harald

+0

@ハラルドありがとう。私は自分が「プロセス」と言うことを何度も「プログラム」と打ち込んでいました。 1人はそれによって滑った。 – chepner