Bash

為什麼“*”命令的輸出是啟動?

  • April 16, 2021

我使用了*命令,我看到了這個錯誤:

bash: boot: command not found

為什麼會出現這個錯誤?

您在命令行上鍵入的第一個單詞將被您的 shell 解釋為命令的名稱。

shell 會將*文件名萬用字元擴展為目前目錄中所有可見的名稱。名稱將按字典順序排序。

您在一個目錄中,其中名稱boot是首先排序的名稱。這意味著僅* 在該特定目錄中鍵入將與嘗試執行以boot該目錄中的所有其他名稱作為命令行參數呼叫的命令相同。

boot在您的系統上,您的 current中沒有呼叫命令$PATH,因此 shell 抱怨它找不到它。

這就是發生的事情。

我的系統上的範例(執行zshshell 而不是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在刪除任何文件之前要求確認。然後他們有機會中止手術。

這是一個有趣的小技巧,但根本不是解決意外刪除文件問題的正確方法。問題的正確解決方案是定期備份。

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