パイプを介して別のコマンドにエクスポートする場合(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