Bash
回顯尾部命令會產生意外的輸出?
此命令單獨執行時會產生預期的結果(crontab 的最後一行):
tail -n 1 /etc/crontab
但是,當我將它作為 echo 命令的一部分執行以將結果發送到文件時,它會添加工作目錄中所有文件的摘要以及預期結果:
sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file'
為什麼這個命令會產生額外的數據?
您的 crontab 行中有一個或多個星號
*
,表示“任何時間”。當從命令替換中替換該行時,結果類似於echo * * * * * cmd > /path/to/file
雖然大多數進一步的擴展不適用於命令替換的輸出,但路徑名擴展是(欄位拆分也是如此):
不應處理命令替換的結果以進行進一步的波浪號擴展、參數擴展、命令替換或算術擴展。如果命令替換發生在雙引號內,則不應對替換結果執行欄位拆分和**路徑名擴展。**
路徑名擴展是變成
*.txt
匹配文件名(萬用字元)的列表,其中*
匹配所有內容。*
最終結果是您在工作目錄中為您的 crontab 行中的每個列出的每個(非隱藏)文件名。如果您發布的程式碼代表更複雜的命令,您可以通過引用擴展來解決此問題:
sudo bash -c 'echo "$(tail -n 1 /etc/crontab)" > /path/to/file'
但更直接地說只是完全失去了
echo
:sudo bash -c 'tail -n 1 /etc/crontab > /path/to/file'
這應該可以滿足您的要求,並且也更簡單(唯一的其他重要區別是此版本將省略否則會發生的欄位拆分,因此不會折疊空格執行)。