符號連結指向正確的二進位文件,但仍然執行另一個?

符號連結指向正確的二進位文件,但仍然執行另一個?

我對這怎麼可能有點困惑。我安裝了新版本的 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 上,您應該使用typecommand -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

相關內容