![符號連結指向正確的二進位文件,但仍然執行另一個?](https://rvso.com/image/1665749/%E7%AC%A6%E8%99%9F%E9%80%A3%E7%B5%90%E6%8C%87%E5%90%91%E6%AD%A3%E7%A2%BA%E7%9A%84%E4%BA%8C%E9%80%B2%E4%BD%8D%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BD%86%E4%BB%8D%E7%84%B6%E5%9F%B7%E8%A1%8C%E5%8F%A6%E4%B8%80%E5%80%8B%EF%BC%9F.png)
我對這怎麼可能有點困惑。我安裝了新版本的 Python,刪除了舊的符號連結並用新的符號連結取代了它們。但由於某種原因,舊的二進位仍然被調用?
pi@raspberrypi:/usr/local/bin$ python -V
Python 3.7.3
pi@raspberrypi:/usr/local/bin$ which python
/usr/local/bin/python
pi@raspberrypi:/usr/local/bin$ ls -l /usr/local/bin/python
lrwxrwxrwx 1 root root 24 Feb 19 17:37 /usr/local/bin/python -> /usr/local/bin/python3.9
pi@raspberrypi:/usr/local/bin$ /usr/local/bin/python -V
Python 3.9.9
pi@raspberrypi:/usr/local/bin$ readlink python
/usr/local/bin/python3.9
誰能解釋這種行為?我是不是做錯了什麼?
答案1
我建議使用command -v
而不是which
.您可以找到更多關於這背後的原因在這個 Unix SE Q/A 中。簡短版本:which
是很久以前的非標準工具。command -v
是一個內建的 shell 和 POSIX 標準。在 Bourne shell 上,您應該使用type
或command -v
。
正如您已經發現的,別名是一種可能的情況,只能使用內建的 shell 來檢測,例如:
$ alias
alias ls='ls --color=auto'
$ type ls
ls is aliased to `ls --color=auto'
$ command -v ls
alias ls='ls --color=auto'
$ which ls
/bin/ls
在您的情況下,它似乎python
被別名為python3
.有很多地方可以定義別名。
答案2
您已在一處安裝了一次 python。然後您將符號連結更改為另一個位置。
我認為您已經遇到了 bash 的優化,透過將結果快取在記憶體中,不必每次鍵入命令時都搜尋 $PATH。
路徑哈希是一個哈希表,由 bash 維護,其中包含運行命令時 shell 應在磁碟上尋找可執行程式的位置。哈希表會在明顯使結果無效的事件(例如修改 $PATH)或使用內建的 散列 命令。
當您再次執行 python 時,bash 只是嘗試從上次找到它的位置獲取它,這會為您提供舊版本。
要使 python 的哈希值無效,請執行下列命令之一:
hash python
hash -r