Bash

為什麼執行“錯誤”的執行檔?

  • May 11, 2018

我正在嘗試從bash(版本)命令行執行ipython 。4.4.19

作為一名 Python 開發人員,我ipython在各種 s’ 路徑中安裝了各種版本的各種版本virtualenv,因此了解我正在執行的版本很重要。因此,$PATH當我更改時總是會更改virtualenv,這將是一個典型值PATH

$ echo $PATH
/Users/jab/.virtualenvs/tools/bin:/Users/jab/bin:/Users/jab/src/git/hub/jab/bin:/usr/local/gnu:/bin:/usr/local/bin:/usr/bin

其中的重要細節是第一個條目是“ /Users/jab/.virtualenvs/tools/bin”,並且該文件/Users/jab/.virtualenvs/tools/bin/ipython確實存在:

$ ls -l /Users/jab/.virtualenvs/tools/bin/ipython
-rwxr-xr-x 1 jab staff 252 May 11 15:18 /Users/jab/.virtualenvs/tools/bin/ipython

正如預期的which那樣,該文件將作為“ $ ipython”命令執行

$ which ipython
/Users/jab/.virtualenvs/tools/bin/ipython

$ $(which ipython) -c "import sys; print(sys.executable)"
/Users/jab/.virtualenvs/tools/bin/python

但是,實際上並非如此,/usr/local/bin/ipython而是執行

$ ipython -c "import sys; print(sys.executable)"
/usr/local/bin/python3

有人可以解釋為什麼bash忽略我$PATH並使用“錯誤”的執行檔嗎?我需要更改什麼(在我的 bashrc中或在我的系統 ( macOS 10.12.3) 中),以便 bash 按照 my 確定的順序選擇執行檔$PATH

注意:這不是重複的Bash is not find a program 即使它在我的路徑上,因為它詢問 PATH 如何查找任何程序,而這個問題是為什麼找到錯誤的程序。

看起來在您的 bash 會話中的某個時間,“錯誤”的執行檔被呼叫,然後它的路徑名被 Bash 記住(這是正常的,這樣的功能可以防止PATH對已知命令的進一步查找)。

要解決此問題,您應該執行

$ hash -d ipython

這清除了 的記憶位置ipython,因此 Bash 需要PATH再次搜尋以找到該命令(這就是它找到正確執行檔的時候)。

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