我有点困惑这是怎么可能的。我安装了新版本的 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 上,您应该使用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