在bash shell中,hash
命令與命令查詢和快取機制緊密相關。當你輸入一個命令時,bash需要找到該命令的可執行檔案的位置(即其路徑)以便執行它。bash有幾種方式來完成這個任務,其中之一就是使用雜湊表(hash table)來快取之前查詢過的命令的路徑。這就是hash
命令發揮作用的地方。
1. hash命令的作用
- 顯示或清除雜湊表:
- 當你不帶任何引數執行
hash
命令時,它會列出當前雜湊表中所有已快取的命令及其對應的路徑。 - 使用
hash -r
或hash --forget-all
可以清除整個雜湊表,即刪除所有已快取的命令路徑。這在某些情況下很有用,比如當你更新了某個命令的位置,但bash仍然使用舊的快取路徑時。
- 當你不帶任何引數執行
- 快取命令路徑:
- 當bash首次執行一個命令時,它會透過環境變數
PATH
中指定的目錄來搜尋該命令的可執行檔案。一旦找到,bash就會將該命令的名稱和路徑儲存在雜湊表中,以便將來更快地找到它。 - 雖然
hash
命令本身不直接用於新增命令到雜湊表(這是bash自動完成的),但你可以透過執行命令來觸發這個過程。然後,你可以使用hash
命令不帶引數來檢視該命令是否已被快取。
- 當bash首次執行一個命令時,它會透過環境變數
- 最佳化效能:
- 透過快取命令的路徑,bash能夠避免在每次執行命令時都進行耗時的
PATH
搜尋。這可以顯著提高命令執行的效率,尤其是在執行大量相同命令的指令碼中。
- 透過快取命令的路徑,bash能夠避免在每次執行命令時都進行耗時的
2. 注意事項
- 如果一個命令的路徑在
PATH
中發生了變化(比如,你安裝了一個新版本的命令,或者移動了舊版本的命令),bash可能不會立即注意到這個變化,因為它仍然使用雜湊表中快取的舊路徑。在這種情況下,你可以使用hash -d [command]
來刪除特定命令的雜湊條目,或者使用hash -r
來清除整個雜湊表。 hash
命令和bash的雜湊表機制是bash特有的,不是所有shell都支援。
3. 示例
假設你安裝了一個新的版本的git
命令,並更新了PATH
以包含新版本的路徑。為了確保bash使用新版本的git
,你可以執行:
hash -d git # 刪除git的雜湊條目
git --version # 現在bash會重新搜尋PATH,找到並快取新版本的git路徑
或者,更簡單地,你可以清除整個雜湊表:
hash -r
git --version # bash會重新搜尋PATH,找到並快取所有命令的新路徑(如果它們已經改變了的話)