(注:これら2つの例は可能GNUまたはBSDが必要で、find
POSIX「バージョン」では現状のまま機能しない場合があります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
そのような参照が有効な場合、空白は保持されます。