Bash命令路径的缓存

升级到OS X 10.9后,系统默认的python已经升级到2.7.5了,所以以前通过ports安装的2.7.3版本就没有必要了。 于是就使用port卸载了。

sudo port uninstall --follow-dependents python27

完整的问题描述在这

最后通过Google找到答案,原来Bash会对命令的路径解析进行缓存。

通过hash -l命令可以查看当前所有缓存的命令路径:

➜ ~ $ hash -l
builtin hash -p /Users/adyliu/bin/hosts hosts
builtin hash -p /usr/bin/which which
builtin hash -p /usr/bin/host host
builtin hash -p /usr/bin/python2.6 python2.6
builtin hash -p /usr/bin/python2.7 python2.7
builtin hash -p /usr/bin/locate locate
builtin hash -p /usr/bin/python2.5 python2.5
builtin hash -p /usr/bin/du du
builtin hash -p /bin/cat cat
builtin hash -p /usr/bin/vim vim
builtin hash -p /usr/bin/sudo sudo
builtin hash -p /usr/bin/java java
builtin hash -p /usr/bin/uname uname
builtin hash -p /opt/local/bin/python2 python2
builtin hash -p /usr/local/bin/python3 python3
builtin hash -p /usr/bin/man man
builtin hash -p /usr/bin/less less
builtin hash -p /opt/local/bin/otool otool
builtin hash -p /bin/ls ls
builtin hash -p /usr/bin/python python

可通过如下命令之一清除缓存:

hash -r
hash -d python2.7

Bash 为了提高命令的解析速度,将解析过的命令的全路径保存在hash表中,因此下次执行的时候就无需进行再次解析。

hash 有如下几个参数:

  • -d [name]… 删除某个命令的路径缓存
  • -r 删除所有命令的路径缓存
  • -t [name] 列出某个命令的缓存路径(如果有的话)
  • -l 列出全部的路径缓存

可使用 help hash 来查看帮助,不过文档没有格式化,比较难看。