Shell
在管道中使用名稱中包含空格的文件
我有一個名為的文件夾
play
,其中包含一個文件damn file
(帶空格)。當我使用find
並將輸出傳輸到tar
:find play/ -name 'damn*' | tar cf archive.tar -T -
它完美地工作。為什麼會這樣 的輸出
find
包含應該導致問題的空間tar
。當我使用這個命令時:tar cf archive.tar $(find play/ -name 'damn*')
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
我糊塗了。為什麼第一個範例有效?
在第二個範例中,shell 刪除了換行符,shell 對命令替換的輸出進行了分詞。由於預設情況下包含換行符
IFS
,因此它們被視為欄位分隔符,而不是欄位本身的一部分。在第一個範例中,輸入來自管道而不是外殼,因此外殼無法進行分詞。雙引號命令替換 (
"$(find ... )"
) 將防止發生分詞,但find
內部命令替換幾乎總是一個壞主意,所以不要這樣做。為了最大程度的安全,無論何時您可以訪問 GNU 版本的 Unix 工具,您都應該使用空分隔符選項:find dir/ -name '...' -print0 | tar cf foo.tar --null --no-recursion -T -