Bash
為什麼“*”命令的輸出是啟動?
我使用了
*
命令,我看到了這個錯誤:bash: boot: command not found
為什麼會出現這個錯誤?
您在命令行上鍵入的第一個單詞將被您的 shell 解釋為命令的名稱。
shell 會將
*
文件名萬用字元擴展為目前目錄中所有可見的名稱。名稱將按字典順序排序。您在一個目錄中,其中名稱
boot
是首先排序的名稱。這意味著僅*
在該特定目錄中鍵入將與嘗試執行以boot
該目錄中的所有其他名稱作為命令行參數呼叫的命令相同。
boot
在您的系統上,您的 current中沒有呼叫命令$PATH
,因此 shell 抱怨它找不到它。這就是發生的事情。
我的系統上的範例(執行
zsh
shell 而不是bash
,但在這方面它的工作方式相同):% cd / % ls altroot bsd bsd.sp home sbin usr bin bsd.booted dev mnt sys var boot bsd.rd etc root tmp % * zsh: command not found: altroot
當我使用 just
*
時,shell 會嘗試執行一個名為 的命令altroot
,因為名稱altroot
(恰好是目錄的名稱)在*
我所在目錄中的文件名通配模式的擴展中首先排序。通過文件名通配模式選擇要執行的命令容易出錯且很危險,因此最好避免。
作為一個有點相關的軼事,我相信我已經看到使用者在包含重要文件的目錄中創建了一個名為
-i
的文件。所以他們可能有類似的東西$ ls -l total 0 -rw-r--r-- 1 myself wheel 0 Apr 16 18:49 -i -rw-r--r-- 1 myself wheel 0 Apr 16 18:49 important-file-1.txt -rw-r--r-- 1 myself wheel 0 Apr 16 18:49 important-file-2.txt -rw-r--r-- 1 myself wheel 0 Apr 16 18:49 important-file-3.txt
請注意如何
-i
排序?這意味著當他們rm -rf *
(錯誤地)在這個目錄中時,會發生這種情況:$ rm -rf * remove important-file-1.txt? n remove important-file-2.txt? n remove important-file-3.txt? n
也就是說,
-i
名稱作為選項插入到rm -rf
,這會rm
在刪除任何文件之前要求確認。然後他們有機會中止手術。這是一個有趣的小技巧,但根本不是解決意外刪除文件問題的正確方法。該問題的正確解決方案是定期備份。