パイプラインとプロセスの交換

パイプラインとプロセスの交換

cat "$@"標準入力の1つからデータを読み取ろうとするときまたはファイルを見るとパイプとプロセスの置き換えは、行方不明の改行を異なる方法で処理します。:

printf %s foo > test.txt

unset REPLY
while read
do
    :
done < <(cat test.txt)
echo "$REPLY" # Prints foo

unset REPLY
cat test.txt | while read
do
    :
done
echo "$REPLY" # Prints nothing!

これは意図的に設計されていますか?この「機能」はどこに文書化されていますか?

ああ! @feredは正しい考えを持っています。これは、変数の値がどのように失われるかについての別の例にすぎません。パイプされたコマンドはサブシェルで実行されます。

答え1

パイプの変数はパイプをアクティブにしません。 :)
プロセス置換はデータをファイル記述子にリダイレクトします。裏面のプロセスはパイプラインとは異なります|。以下はすべて同じパイプ内にあるため動作します。

unset REPLY
cat test.txt | { 
  while read ;do : ;done
  echo "$REPLY" 
} # Prints foo!

関連情報