Bash

回顯尾部命令會產生意外的輸出?

  • April 16, 2019

此命令單獨執行時會產生預期的結果(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'

這應該可以滿足您的要求,並且也更簡單(唯一的其他重要區別是此版本將省略否則會發生的欄位拆分,因此不會折疊空格執行)。

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