![bash:这两个脚本变体有什么区别?](https://linux22.com/image/60218/bash%EF%BC%9A%E8%BF%99%E4%B8%A4%E4%B8%AA%E8%84%9A%E6%9C%AC%E5%8F%98%E4%BD%93%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
(注:这两个例子可能需要 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
如果这种引用有效,那么空格将被保留。