Shell
find .
和 /home/user/* 作為 for 命令的輸入有什麼區別
find .
和/home/user/*
作為命令的輸入有什麼區別for
?例如:for var in $(find .) do echo "$var" done
或者
for var in /home/user/* do echo "$var" done
在第一種情況下
for
,命令使用包含空格的名稱分解文件。而在第二種情況下則不然。為什麼?
這是 shell 的標準做法。操作順序是命令替換(
$(find .)
),然後是分詞,然後是全域擴展(/home/user/*
)。來自POSIX 標準(單詞拆分 = 欄位拆分;全域擴展 = 路徑名擴展):
擴詞順序如下:
- 波浪號展開(參見波浪號展開)、參數展開(參見參數展開)、命令替換(參見命令替換)和算術展開(參見算術展開)應從頭到尾執行。請參閱令牌辨識中的第 5 項。
- 除非 IFS 為空,否則應在步驟 1 生成的欄位部分上執行欄位拆分(請參閱欄位拆分)。
- 除非 set -f 生效,否則應執行路徑名擴展(請參閱路徑名擴展)。
- 報價刪除(請參閱報價刪除)應始終最後執行。
出於這個原因,始終建議盡可能使用 glob,以便分詞不會干擾您的文件名。該
$(find)
構造實際上是Bash Pitfall #1的一個範例。