Bash読み取りコマンドとstdinリダイレクト

Bash読み取りコマンドとstdinリダイレクト

私が理解している限り、bash文書は|と<標準入力をリダイレクトします。したがって、cmd | fooandはfoo < <(cmd)ある程度同じでなければなりません。しかし、bash-internal readコマンドの場合はそうではありません。たとえば、私が入力した場合

a=""; b=""; read a b < <(echo a b); echo $a $b

a b同時に出力されます

a=""; b=""; echo a b | read a b; echo $a $b

何も印刷されません。一方、私が入力した場合

a=""; b=""; cat < <(echo a b) >foo1

a=""; b=""; echo a b | cat > foo2

ファイル foo1 と foo2 は同じです。だから私の質問は:コマンドを読むとき(または一般的に)2つの形式の違いは何ですか?まったく同じリダイレクト入力を表示する必要があります。フォームが動作している間は読みにくく、< <(...)パイプフォームを使用することを好みます。

答え1

パイプ操作はreadサブシェルで実行されますが、プロセス置換は実行されません。ほとんどのユースケースではこれは問題ではありませんが、この場合は変数を操作してシェルに直接影響を与えたいと思います。readサブシェルから呼び出されるため、サブシェルのみが影響を受けます。したがって、実行するすべての操作はサブシェルでも実行する必要があります。たとえば、次のようになります。

echo a b | { read a b ; echo "$a" "$b" ; }

関連情報