
考慮這些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
只是因為它沒有要顯示的輸入,而是將 *(所有)文件列表作為參數來顯示為字串
就如此容易
而 * 是參數,它會回顯“*”內容,因此檔案列表