符号链接指向正确的二进制文件,但是仍然执行另一个二进制文件?

符号链接指向正确的二进制文件,但是仍然执行另一个二进制文件?

我有点困惑这是怎么可能的。我安装了新版本的 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 问答中。简短版本: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

相关内容