Shell

find . 和 /home/user/* 作為 for 命令的輸入有什麼區別

  • November 13, 2014

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 標準(單詞拆分 = 欄位拆分;全域擴展 = 路徑名擴展):

擴詞順序如下:

  1. 波浪號展開(參見波浪號展開)、參數展開(參見參數展開)、命令替換(參見命令替換)和算術展開(參見算術展開)應從頭到尾執行。請參閱令牌辨識中的第 5 項。
  2. 除非 IFS 為空,否則應在步驟 1 生成的欄位部分上執行欄位拆分(請參閱欄位拆分)。
  3. 除非 set -f 生效,否則應執行路徑名擴展(請參閱路徑名擴展)。
  4. 報價刪除(請參閱報價刪除)應始終最後執行。

出於這個原因,始終建議盡可能使用 glob,以便分詞不會干擾您的文件名。該$(find)構造實際上是Bash Pitfall #1的一個範例。

引用自:https://unix.stackexchange.com/questions/167660