
鑑於:
/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
(rehash
在zsh
shell 中) 完成的。如果只想忘記可執行檔的位置cmake
,請使用hash -d cmake
(unhash cmake
在zsh
shell 中)。
這個問題的早期版本也想知道為什麼這兩個命令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
以及使用它的陷阱可以在這裡找到:為什麼不用「哪個」呢?那該用什麼呢?