bash 的 * 是如何傳遞給程式的?

bash 的 * 是如何傳遞給程式的?

當我輸入evince *包含大量 pdf 的資料夾時,會發送什麼內容到 evince? evince 是否接收 X 個參數,或是開啟了 X 個 evince 機會,每個機會獲得一個參數(單一檔案)?

答案1

Bash 在每個命令列上執行 shell 擴充。這些擴展之一是檔案名稱擴充*根據替換模式匹配規則。

如果是evince *,它將用*當前工作目錄的內容替換 。內容是指常規檔案、子目錄、連結等的名稱。基本上你從跑步中得到的東西ls。在您的情況下,PDF 的檔案名稱。

因此,evinceBash 僅執行一次二進位文件,參數是目前工作目錄中包含的按字母順序排列的文件名稱。 Evince 之後處理其啟動的方式取決於 Evince 或它所依賴的任何框架或函式庫,但準系統 X 在這裡沒有做任何特別的事情。 Evince 或 X 甚至不知道它是用*.例如:

$ ls -a
. .. .hiddendoc.pdf doc1.pdf doc2.docx otherdoc.pdf somedir
$ evince *
# is equivalent to
$ evince doc1.pdf doc2.docx otherdoc.pdf somedir

如果你想知道如何*擴展,只需運行echo *.您可能會注意到,如果工作目錄為空(僅包含點檔案),則星號不會展開並保留作為命令執行的參數。

正如連結的 Bash 手冊中提到的,有許多設定可以更改此行為。更不用說其他的貝殼了。

相關內容