為什麼echo解釋*為做同樣的事情ls

為什麼echo解釋*為做同樣的事情ls

考慮這些shell命令

$ls
my_app  newlist  note

$echo *
my_app  newlist  note

$printf *
my_app

第一個命令ls將列出有關文件的資訊(預設為當前目錄)。第二個命令echo是輸出作為參數傳遞的字串的命令。但是,當我輸入時,echo *它的輸出與ls.

並且printf *只給我第一個文件名作為輸出

為什麼會echo這樣解釋*呢?為什麼printf,更奇怪的是:只輸出第一個?

答案1

為什麼echo解釋*為做同樣的事情ls

答案很簡單。它不是。echo正如你所說:它迭代其參數並輸出它們,它們之間有一個空格。

那為什麼我們會看到這樣的行為呢ls

這是因為 shell 會將 替換為*與所有檔案相符的參數清單(不以 a 開頭.(除非 dotglob in on))。然後echo就做它的事情。這種全域替換將發生在全部命令,因為它是由 shell 完成的,而不是由命令完成的。

那麼呢printf

printf是列印格式。第一個參數是格式。如果你這樣做printf "%s " *,那就是這樣echo

如果第一個文件是hello%sworld,那麼您將得到:hellofile2world hellofile3world

探索更多

嘗試這個。它將幫助您了解正在發生的事情。 (我並不是建議您將此程式碼用於任何實際用途。只是將其用於學習)。

嘗試cat /proc/self/cmdline * | less-它將在開始時顯示命令列的樣子(在 shell 完成其工作之後)。

答案2

只是因為它沒有要顯示的輸入,而是將 *(所有)文件列表作為參數來顯示為字串

就如此容易

而 * 是參數,它會回顯“*”內容,因此檔案列表

相關內容