なぜecho hello | Bashからmyvar&&echo $ myvar出力を読みませんか? Zshはうまくいきます。

なぜecho hello | Bashからmyvar&&echo $ myvar出力を読みませんか? Zshはうまくいきます。

myvarこの例では、Bashがなぜ価値がないのか、まったく理解していません。

 echo hello | read myvar && echo $myvar

2つの別々のコマンドでコマンドを実行すると、変数の範囲が2行目には存在しないことがわかります。

答え1

パイプ処理されたプロセスはサブシェルで実行され、サブプロセスは親プロセスの環境に影響を与えることはできません。子プロセスが終了すると、独自の環境も消えます。あなたの例では、サブシェルで実行 - myvarが設定されていますが、両方のステートメントを実行している親シェルにread myvar再度伝播されません。echo

ここで文字列を使用するかリダイレクトする必要があります。プロセスの交換パイプの代わりに。たとえば、

文字列は次のとおりです。

$ read myvar <<<"hello" && echo $myvar
hello

文字列は固定文字列、変数、または2つの組み合わせです。

$ read myvar <<<"Hello $USER, your home is $HOME" && echo $myvar
Hello cas, your home is /home/cas

リダイレクトとプロセスの置き換え:

$ read myvar < <(echo hello) && echo $myvar
hello

また見なさい: 私の変数が1つの「読み込み中」ループではローカルですが、一見似ている他のループではローカルではないのはなぜですか?

関連情報