從猛砸男子頁:
命令執行
[...]
如果該名稱既不是shell函數也不是內建函數,並且不包含斜槓,bash會搜索PATH
的每個元素以獲取包含該名稱的可執行文件的目錄。 Bash使用哈希表來記住可執行文件的完整路徑名(請參閱hash
下的SHELL BUILTIN命令)。僅當在哈希表中未找到該命令時,纔會執行PATH
中目錄的完整搜索。如果搜索不成功,shell會搜索名爲command_not_found_handle
的定義的shell函數。如果該函數存在,則使用原始命令和原始命令的參數作爲其參數來調用該函數,並且函數的退出狀態將成爲shell的退出狀態。如果沒有定義的功能,殼打印錯誤消息,並返回127
退出狀態讓我們嘗試了這一點:
$ foobar
bash: foobar: command not found
$ function command_not_found_handle { echo "I'm so sorry, what is '$1'?"; }
$ foobar
I'm so sorry, what is 'foobar'?
你的shell初始化代碼可能會安裝一個更有用的command_not_found_handle
。您通常會在/etc/bash.bashrc
或其來源的文件的全系統配置中找到此類代碼。您的發行版可能會在那裏安裝一個處理程序來調用一個外部程序,該程序會查詢發行版的程序包管理器中的命令或「類似」命令。對於你的Ubuntu,這將在command-not-found
package執行。
發行版附帶的默認配置文件通常保持非常通用,因此該功能可能會檢查是否安裝了command-not-found
二進制文件,如果是,則調用它或打印簡單的錯誤消息。
function command_not_found_handle {
if [ -x /usr/bin/command-not-found ]
then
/usr/bin/command-not-found "$1"
else
echo "$1: Command not found" >&2
return 127
fi
}
這樣,配置文件沒有在安裝或稍後再取出command-not-found
包被改變。
我不知道該程序是如何實現的,但通常情況下,這樣的工具會列出所有已知的命令並找到最相似的命令。然後,它可能會檢查該程序是否已安裝,如果沒有,請檢查程序包是否提供了該程序,並建議安裝該程序。
搜索「相似文本」通常是通過計算兩個字符串之間的edit distance來完成的。考慮到給定的字母在給定當前鍵盤佈局的情況下可能會被誤認爲是一個非常聰明的添加。
謝謝!你怎麼知道這件事的?我的意思是用更一般的方式說,沒有SO,我怎麼才能從CLI中發現什麼函數? – Ketcomp
@Kcompcomp:閱讀「男人bash」。 (位於'COMMAND EXECUTION'部分的第三段。) – rici