次のような変数をエクスポートするスクリプトがあるとします。
#!/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