bash:これら2つのスクリプトバリエーションの違いは何ですか?

bash:これら2つのスクリプトバリエーションの違いは何ですか?

(注:これら2つの例は可能GNUまたはBSDが必要で、findPOSIX「バージョン」では現状のまま機能しない場合がありますfind

次の2つのスクリプトは、次のように理解する必要があります。抜粋より複雑なスクリプトでは、ポイントは数行に圧縮されます。
私が得るときまったく同じ2つのバリエーションの結果、これら2つの実装の違い(それぞれ:トラップ)がどこにあるのか疑問に思います。

  • 亜種1
while IFS= read -r f; do

  echo "reading entry: "$f""

done < <(find ~/workdocs -type f -name '*.pdf' -print)
  • 亜種2
while IFS= read -rd '' f; do

  echo "reading entry: "$f""

done < <(find ~/workdocs -type f -name '*.pdf' -print0)


それが明らかになった出力(この質問はまさにこれです)まったく同じどちらの場合も。 (出力ログファイルにリダイレクトし、両方をdiffテストしてテストしました。)
しかし、何があるのか​​疑問に思います。エッジケースこれにより、実際にバリアント#1と#2の出力が異なる可能性があります。

それが私が知りたいことです。

答え1

理解と可視性を高めるために、回答の説明引用セクションを乱用しました。 SEカルマが私を許してくれます…

これは(内容に応じてf)特別な場合であり、問​​題を確認するのは簡単ではありません。

> f=foo
> set -x
> echo "reading entry: "$f""
+ echo 'reading entry: foo'
reading entry: foo

シェルデバッグモードでは、文字列のみが表示されます。しかしそれはいいえ「ネストされた参照」のため。

変数の内容を変更したりコマンドラインを変更したりすると、問題が明らかになります。

> f=foo

> set -x

> echo "reading entry: " $f ""
+ echo 'reading entry: ' foo ''
reading entry: foo

> echo "reading entry: "    $f     ""
+ echo 'reading entry: ' foo ''
reading entry: foo

> f="foo    bar"
+ echo 'reading entry: foo' bar
reading entry: foo bar

そのような参照が有効な場合、空白は保持されます。

関連情報