Maj*_*imi 4 shell tar pipe find whitespace
我有play一个名为的文件夹,其中包含一个文件damn file(带空格)。当我使用find和管道输出到tar:
find play/ -name 'damn*' | tar cf archive.tar -T -
Run Code Online (Sandbox Code Playgroud)
它完美地工作。为什么这有效find包含应该导致问题的空间的输出tar. 当我使用此命令时:
tar cf archive.tar $(find play/ -name 'damn*')
Run Code Online (Sandbox Code Playgroud)
bash 显示这些错误:
tar: play/damn: Cannot stat: No such file or directory
tar: file: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Run Code Online (Sandbox Code Playgroud)
我糊涂了。为什么第一个例子有效?
在第二个示例中,换行符被 shell 删除,它对命令替换的输出进行分词。由于IFS默认情况下包含换行符,因此它们被视为字段分隔符,而不是字段本身的一部分。在第一个示例中,输入来自管道而不是外壳,因此外壳无法进行分词。
双引号命令替换 ( "$(find ... )") 将防止发生分词,但find内部命令替换几乎总是一个坏主意,所以不要这样做。为了最大的安全性,无论何时您可以访问 GNU 版本的 Unix 工具,您都应该使用空分隔符选项:
find dir/ -name '...' -print0 | tar cf foo.tar --null --no-recursion -T -
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4100 次 |
| 最近记录: |