MacPorts 说当 "python --version" 是 运行 时我还有 Python 2.7

MacPorts says I still have Python 2.7 when "python --version" is run

指示 MacPorts 切换到 Python 3.4 后,python --version 仍然输出 2.7.10。请注意 "which python" 确实表明 /opt/local/bin 在我的路径中 /usr/bin/ 之前出现:

$ which python
/opt/local/bin/python
$ python --version
Python 2.7.10
$ ls -l /opt/local/bin/python
lrwxr-xr-x  1 root  wheel  24 Aug  1 10:00 /opt/local/bin/python -> /opt/local/bin/python2.7
$ sudo port select --list python
Available versions for python:
    none
    python26-apple
    python27 (active)
    python27-apple
    python34
$ sudo port select --set python python34
Selecting 'python34' for 'python' succeeded. 'python34' is now active.
$ which python
/opt/local/bin/python
$ python --version
Python 2.7.10
$ ls -l /opt/local/bin/python
lrwxr-xr-x  1 root  wheel  24 Aug  1 10:00 /opt/local/bin/python -> /opt/local/bin/python3.4

请注意符号链接是如何变化的,但声明的版本没有变化。给出了什么?

tl;dr: 运行 hash -r.


出于速度原因,当您在 shell.

中键入 python 时,shells 会保留可执行文件需要 运行 的缓存

想想如果没有这样的缓存,shell 会怎样:对于您输入的每个命令(不是绝对路径),shell 必须

  1. 检查 $PATH 中的条目,并针对每个条目
  2. 发出stat(2)系统调用来测试命令是否存在于当前搜索的目录中。请记住,在 shell 最初开发时,这可能涉及慢速旋转磁盘甚至网络文件系统。

为了加快速度,大多数 shell 只会对每个命令执行一次,直到 $PATH 被更改,或者您手动告诉 shell 删除缓存(例如,在 bash 中使用 hash -r,在其他一些 shell 中使用 rehash

我听说有些 shell 也缓存符号链接。