bash:这两个脚本变体有什么区别?

bash:这两个脚本变体有什么区别?

(注:这两个例子可能需要 GNU 或 BSD find,并且可能无法按原样与 的 POSIX“版本”一起工作find

下面的两个脚本必须理解为摘录来自更复杂的脚本,其要点被压缩为几行。
当我得到完全一样两种变体的结果,我想知道这两种实现的差异(分别:陷阱)可能在哪里......

  • 变种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

shell 调试模式仅显示一个字符串。但那就是不是由于“嵌套引用”。

变量内容的改变或者命令行的改变就会显示问题:

> 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

如果这种引用有效,那么空格将被保留。

相关内容