パイプ読み取りコマンドが機能しません。

パイプ読み取りコマンドが機能しません。

file1stdinにリダイレクトすると、shの読み取りコマンドが機能します。

$ cat file1
first second
$ read u v <file1
$ echo $u
first
$ echo $v
second

しかし、echoのようにstdoutをリダイレクトすると、

$ echo first second | read a b
$ echo $a

これはうまくいきません。 2番目のケースでは、readがパイプから標準入力を取得すると思います。私はなぜ間違ったのですか?ありがとうございます。

ベストアンサー1

最初の例では、次のようになります。

read「echo」は、コマンドを入力する対話型シェル(同じプロセス)によって実行されるシェル組み込みコマンドであるため、これらのコマンドの結果は、実行中のシェル環境によって異なります。

したがって、コマンドから戻ると、readu変数とv変数の値に関する完全な知識があり、まだ同じシェルにあります。

2番目の例では:

コマンドが組み込まれていても、パイピングはインタラクティブシェルがサブプロセスをフォークするように強制します。この場合、親環境に影響を与えずに読み取りコマンドを実行し、独自の環境を更新する(u変数とv変数に値を割り当てる)サブシェルをトリガーします。

したがって、読み取りが完了すると、サブシェルは終了して対話型シェルに戻ります。これは、サブシェルで設定されたuおよびv変数の値をまったく認識しない状態です。

おすすめ記事