Bash

雜湊命令的目的是什麼?

  • May 17, 2021

如果你執行hash它,它會顯示自上次重置雜湊以來執行的所有命令的路徑 ( hash -r)

[root@c04c ~]# hash
hash: hash table empty

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
  1    /usr/bin/whoami

[root@c04c ~]# whoami
root

[root@c04c ~]# hash
hits    command
  2    /usr/bin/whoami

根據手冊頁,雜湊的目的是:

/usr/bin/hash 實用程序會影響目前 shell 環境記住找到的實用程序位置的方式。根據指定的參數,它會將實用程序位置添加到其記住的位置列表中,或者清除列表的內容。當沒有指定參數時,它會報告列表的內容。該-r選項會導致 shell 忘記所有記住的位置。

作為 shell 的內置工具提供的實用程序不會由散列報告。

除了看到我輸入了多少次命令之外,我看不到hash.

它甚至出現在 thegeekstuff.com 的15 個有用命令中

在哪些方面hash有用?

hash是一個 bash 內置命令。雜湊表的一項功能是通過將結果記憶體在記憶體中bash 來防止$PATH每次鍵入命令時都必須進行搜尋。該表在明顯使結果無效的事件上被清除(例如修改$PATH

hash命令就是您與該系統互動的方式(無論出於何種原因您認為需要)。

一些案例:

  • 就像您看到的那樣,如果您在沒有參數的情況下鍵入它,它會列印出您點擊了多少次命令。這可能會告訴您最常使用哪些命令。
  • 您還可以使用它來記住非標準位置的執行檔。

例子:

[root@policyServer ~]# hash -p /lol-wut/whoami whoami
[root@policyServer ~]# whoami
Not what you’re thinking
[root@policyServer ~]# which whoami
/usr/bin/whoami
[root@policyServer ~]# /usr/bin/whoami
root
[root@policyServer ~]#

$PATH如果您在想要執行的目錄之外的目錄中只有一個執行檔,則這可能很有用,只需鍵入名稱而不是包含該目錄中的所有內容(如果您將其添加到,這將是效果$PATH)。

別名通常也可以做到這一點,但由於您正在修改目前 shell 的行為,它不會映射到您啟動的程序中。到單獨的執行檔的符號連結可能是這裡的首選選項。hash是一種方法。

  • 您可以使用它來忘記文件路徑。PATH如果一個新的執行檔在較早的目錄中彈出或mv’d 到其他地方,並且您想強制 bash 出去並再次找到它,而不是它記得的最後一個位置找到它,這將很有用。

例子:

[root@policyServer ~]# hash
hits    command
  1    /bin/ls
[root@policyServer ~]# cp /bin/ls /lol-wut
[root@policyServer ~]# hash
hits    command
  1    /bin/cp
  1    /bin/ls
[root@policyServer ~]# hash -d ls
[root@policyServer ~]# ls
default.ldif  newDIT.ldif  notes.txt  users.ldif
[root@policyServer ~]# hash
hits    command
  1    /bin/cp
  1    /lol-wut/ls
[root@policyServer ~]#

cp命令導致ls執行檔的新版本出現在我的較早版本中,$PATH但沒有觸發對雜湊表的清除。我曾經選擇性地從雜湊表中hash -d清除條目。ls然後 Bash 被迫$PATH再次瀏覽,當它瀏覽時,它在較新的位置找到了它(在 $PATH 中比它之前執行的更早)。

但是,您可以有選擇地呼叫此“從$PATH”行為中查找執行檔的新位置:

[root@policyServer ~]# hash
hits    command
  1    /bin/ls
[root@policyServer ~]# hash ls
[root@policyServer ~]# hash
hits    command
  0    /lol-wut/ls
[root@policyServer ~]#

如果您想從雜湊表中刪除某些內容並且不是 100% 可以註銷然後成功重新登錄,或者您想保留對 shell 所做的一些修改,您通常只想這樣做。

要擺脫陳舊的映射,您還可以執行hash -r(or export PATH=$PATH) 來有效地清除 bash 的整個雜湊表。

像這樣的小情況還有很多。我不知道我是否稱它為“最有用”的命令之一,但它確實有一些案例。

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