質問: エクスポートされるシェル変数とbashにないシェル変数の違い bashはエクスポートされた変数とエクスポートされていない変数を区別するようです。例:$ foo=bar $ env | grep foo $ set | grep foo foo=bar setは変数を認識しますが、envは認識しません。$ export bar=foo $ env | grep foo bar=foo $ set | grep foo bar=foo foo=bar setは両方の変数を表示しますが、envはエクスポートされた変数のみを表示します。setはbashビルトインであり、envはそうではないことを知っています。エクスポートされる変数とエクスポートされない変数の違いは何ですか?
回答: エクスポートされた変数は、それらをエクスポートしたシェルによって実行されたコマンドの環境に取り込まれますが、エクスポートされていない変数は、現在のシェルの呼び出しに対してローカルです。 export manページから: シェルは、指定された名前に対応する変数にエクスポート属性を与えます。これにより、それらはその後実行されるコマンドの環境に置かれます。 setは、エクスポートされていないローカル変数を含む現在の環境を出力します。 envは、新しい環境でプログラムを起動するために使用されます。引数を指定しないと、新しい環境がどうなるかが出力されます。 envは新しい環境を作成しているため、シェルから起動されたプログラムの場合と同様に、エクスポートされた変数のみが渡されます。たとえば、最初のシェル内に2番目のシェルを生成する(私は$$は、内側のシェルでプロンプトを表します):$ foo=bar $ bash $$ echo $foo # note the empty line $$ exit $ export foo $ bash $$ echo $foo bar $$ 値ではなく、エクスポートされる変数であることに注意してください。これはつまり、export foo、fooはグローバル変数になり、後で変更された場合でも後続の環境で表示されます。$ export foo $ foo=bar $ bash $$ echo $foo bar $$