エクスポートは、他のコマンドに渡すときに変数を設定しません。

エクスポートは、他のコマンドに渡すときに変数を設定しません。

パイプを介して別のコマンドにエクスポートする場合(bash 3.2を使用)、この変数は変更されません。

export USER=new | cat ; env | grep USER

出力:USER=old

ユーザー変数は変更されず、そのまま残ります。ただし、エクスポートは正常に終了します。export USER=new | echo $?出力0.

答え1

通常、パイプラインの各セクション(一部のシェルの最後のセクションを除く)はサブシェルで実行されます。つまり、シェルは各セクションごとに独自のコピーを作成し、各コピーはそのセクションのコマンドを処理し、外部コマンドを実行します(そこのようにcat)。変更された値は、次のコマンド(他のパイプ)を実行し続けるデフォルトのシェルには表示されません。

(とにかく、varこのようなコマンドの後にどのような値が現れると予想していますかvar=foo | var=bar?)

通常、これはパイプラインの最後の部分で変数割り当てを実行したときに発生します。

n=0
some command | while read line; do n=$((n+1)); done

n多くのシェルではこれは設定を維持します0が、すべてではありません。 kshとzshはデフォルトシェルの最後の部分を実行し、Bashにはオプションがあります。これについては以下で議論する。私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?

答え2

次のようにコードを書き直します。

export USER=new
env | grep $USER

USER以前に必要な変数の内容を取得するには$。コマンドにSTDOUTへの出力がないため、exportパイプを開いても役に立ちません。export

関連情報