為什麼「echo $(cat /path/to/fileName)」列出我的文件和說明?

為什麼「echo $(cat /path/to/fileName)」列出我的文件和說明?

當我使用 列印文件內容時echo $(cat /path/to/filename),它也會列出我的文件和說明。但當我這樣做時printf "$(cat /path/to/filename)\n"效果很好。

我也嘗試將其保存到變數中content='cat /path/to/filename'(也content=$(cat /path/to/filename),然後按 列印echo $content,但我得到了相同的結果(列出文件和方向)。

我想將文件的內容儲存到變數中,並將變數傳遞到我的腳本中作為下一個命令的輸入。

請注意,我的文件的內容有特殊字元*

答案1

因為執行命令替換後,如果不引用它們,shell 會對結果執行單字分割(或欄位分割)。

POSIX 定義單字擴充作為:

單字擴展的順序如下:

  1. 應從頭到尾執行波形符擴展(請參閱波形符擴展)、參數擴展(請參閱參數擴展)、命令替換(請參閱命令替換)和算術擴展(請參閱算術擴展)。請參閱令牌識別中的第 5 項。

  2. 欄位分割(請參閱欄位分割)應在步驟 1 產生的欄位部分上執行,除非 IFS 為空

  3. 除非 set -f 有效,否則應執行路徑名擴充(請參閱路徑名擴充)。

  4. 報價刪除(請參閱報價刪除)應始終最後執行。

在您的情況下,*符合目前工作目錄中的所有內容。您必須引用結果才能獲得預期的輸出:

echo "$(cat /path/to/fileName)"

答案2

引用一下:

$ echo "*" >> test
$ echo $(cat test)
bash43-001 bash43-002 bash43-003 bash43-004 bash43-005 test
$ echo "$(cat test)"
*

作為第一條規則,始終引用命令替換。

除非您關閉通配符(或)或引用/轉義它:否則裸露的內容*將在 中擴展。對於命令輸出,最好使用引號。bashset -fsetopt noglob"*" \*

相關內容