
私のbashシェルに次の環境変数があるとしましょう。
export a="Hello World"
bash シェルでプロセスを実行すると、a
子プロセスは環境変数を継承します。
私の質問は次のとおりです。a
子プロセスから環境変数またはシェル変数に継承されますか?つまり、a
子プロセスからエクスポートしますか?
答え1
環境変数として。
これは、子プロセスによって開始されたすべての子プロセスもこの変数を継承することを意味します。
テスト:
$ export FOO=bar
$ sh
$ sh
$ sh
$ echo "$FOO"
bar
$ exit
$ exit
$ exit
上記の環境変数を生成するシェルは、FOO
新しい対話型シェルを起動します。それは別のことを始め、別のことを始めた。この子孫の殻には$FOO
価値がありますbar
。
別のテストでは、サブシェルが環境変数を変更すると、変更は後続のサブシェルに渡されますが、親シェルには渡されないことがわかりました。
$ export FOO=bar
$ ( ( echo "$FOO"; FOO=quux; ( ( ( echo "$FOO" ) ) ) ) )
bar
quux
$ echo "$FOO"
bar
FOO
(この例では、サブシェルもシェル変数を継承するため、エクスポートは重要ではありません。ただし、それぞれが完全に別々のプロセスである場合、( ... )
効果は同じです。)( ... )
環境変数は次のように使用できます。どのプロセスはシェルスクリプトではなくシェルから開始されます。 Cプログラムまたはスクリプトがそれをシェル変数として継承することは意味がありません。awk
これらの言語にはそのような変数の概念がないためです(環境変数は厳密にキーと値のペアですが、シェル変数は整数で入力できます)。 、読み取り専用、配列、関連配列など(シェルの機能によって異なります)。
答え2
/proc/PID/environ からプロセス環境変数を読み取ることができます。したがって、変数をエクスポートすると、この/proc "ファイル"で宣言されます。