file1
stdinにリダイレクトすると、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」は、コマンドを入力する対話型シェル(同じプロセス)によって実行されるシェル組み込みコマンドであるため、これらのコマンドの結果は、実行中のシェル環境によって異なります。
したがって、コマンドから戻ると、read
u変数とv変数の値に関する完全な知識があり、まだ同じシェルにあります。
2番目の例では:
コマンドが組み込まれていても、パイピングはインタラクティブシェルがサブプロセスをフォークするように強制します。この場合、親環境に影響を与えずに読み取りコマンドを実行し、独自の環境を更新する(u変数とv変数に値を割り当てる)サブシェルをトリガーします。
したがって、読み取りが完了すると、サブシェルは終了して対話型シェルに戻ります。これは、サブシェルで設定されたuおよびv変数の値をまったく認識しない状態です。