為什麼 shell 使用 /usr/bin 中的可執行檔而不是 /usr/local/bin 中的可執行檔

為什麼 shell 使用 /usr/bin 中的可執行檔而不是 /usr/local/bin 中的可執行檔

鑑於:

/usr/local/bin/cmake
/usr/bin/cmake
$ cmake # runs /usr/bin/cmake

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

為什麼會這樣,以及如何讓 shell/usr/local/bin/cmake在我鍵入時運行可執行檔cmake(沒有別名等)?

答案1

透過運行發現了問題

$ type -f cmake
cmake is hashed (/usr/bin/cmake)

並清除 bash 哈希值

hash -d cmake

此後,cmake被解釋為預期的。

答案2

在同一 shell 會話的早期某個時刻,您使用過cmake並且在 中找到了該執行檔/usr/bin

然後您安裝了另一個cmake可執行檔/usr/local/bin

shellbash會快取它為您使用的任何外部命令找到的第一個位置,這意味著下次您使用相同命令時,它不必對可執行檔進行昂貴的搜尋。這樣做的缺點就是懶得去看再次當您稍後安裝同名的另一個可執行檔時,即使它是在早$PATH於原始位置的目錄中完成的。

此問題的解決方案是清空bash保留的可執行檔的快取位置。這是透過hash -r(rehashzshshell 中) 完成的。如果只想忘記可執行檔的位置cmake,請使用hash -d cmake(unhash cmakezshshell 中)。


這個問題的早期版本也想知道為什麼這兩個命令type cmake給出which cmake了不同的結果,其中which cmake似乎給出了預期的結果(/usr/local/bin/cmake),而type cmake似乎給出了錯誤的結果(/usr/bin/cmake)。

答案是,這type是一個內建命令,bash它將使用與 shell 使用的命令相同的快取位置,which不是內建指令,因此將無法使用可執行檔的這些快取位置。

在本例中,給出了預期的結果,因為它在您的 中which進行了搜索,但實際上是cmake$PATH錯誤的結果,因為cmake在命令列上運行實際上會不是/usr/local/bin從(由於緩存,這是不知道的)中獲取它which

的歷史總結which以及使用它的陷阱可以在這裡找到:為什麼不用「哪個」呢?那該用什麼呢?

相關內容