シェルからエクスポートされた変数の範囲

シェルからエクスポートされた変数の範囲

次のような変数をエクスポートするスクリプトがあるとします。

#!/bin/bash
foo(){
    eval export one=1
}
foo1(){
    eval export two=2
}
(foo)
foo1
echo "one=$one"
echo "two=$two"

しかし、私は次のような結果を得ます。

root@centos1:~>/tmp/test.sh
one=
two=2 

値を見ることはできませんが、$one見ることができるのはなぜですか$two

ベストアンサー1

グローバル変数設定された瞬間から設定が解除されるか、プロセスが終了する瞬間まで続きます。グローバル(またはローカル)変数は、関連していない子プロセスによって継承されません(サブプロセスがフォーク(サブシェル)の場合、エクスポートまたはエクスポートされていないすべてのもののコピーを取得します)。

グローバル輸出変数グローバル変数に似ていますが、子プロセス(関連していない子プロセスも含む)によって自動的に継承されます(プロセス環境の一部として)。 (エクスポートを使用すると、CXXFLAGS同じプロセスに同じ変数を渡すことができますmake。これは間違いなくシェルのサブシェルではなく、生成されたmakeすべてのプロセスもその変数を取得します。)

あなたの例では、()すべてのもののコピーを取得するサブシェルを作成します。このfooコマンドは、エクスポートした変数を追加してサブシェルを変更し、エクスポートした変数を使用せずにサブシェルを終了します(孫なし)。これで、子プロセスから親プロセスに暗黙的に情報が送信されなくなります。子供たちが自分の環境でやっていることは親に影響を与えません。これが変数がone設定されていない理由です。


ところで、この場合はeval必要ありません。eval

おすすめ記事