二进制文件如何“默认”执行 - 即。在which
命令返回的路径中找到的第一个实际上并不是默认情况下实际执行的二进制文件? (我在2008 MacBook Pro上运行Mac OS X 10.5。)
我刚刚通过运行brew install git
它将新版本安装在路径中更高或更早的位置,而不是旧版本的二进制文件。但是,默认情况下不会执行新版本。就像shell在安装新的二进制文件之前缓存了二进制文件的位置一样 - 但是which
命令在每次运行时都会解析路径。
我想了解这里发生了什么,并了解如何刷新'缓存'而无需注销或重启机器。这就是我所看到的:
which git
返回
/usr/local/bin/git
,而
git --version
返回
git version 1.6.5
但
/usr/local/bin/git --version
返回
git version 1.7.7
进一步检查,
which -a git
返回
/usr/local/bin/git
/usr/local/git/bin/git
/usr/local/bin/git
/usr/local/git/bin/git
/usr/local/bin/git
/usr/local/git/bin/git
(是的 - 我的路径设置有一些冗余。)
/usr/local/git/bin/git --version
返回
git version 1.6.5
更新 - 这是答案bash哈希。 ( from: In bash, "which" gives an incorrect path - Python versions)
type git
git is hashed (/usr/local/git/bin/git)
$ hash -d git
$ type git
git is /usr/local/bin/git
$ which git
/usr/local/bin/git
git --version
git version 1.7.7
答案 0 :(得分:3)
在shell的给定实例中,二进制文件的路径确实被缓存。清除这个的最简单方法是打开一个新的终端窗口。但您也可以使用内置的hash
shell在现有窗口中清除它(有关详细信息,请阅读help hash
)。
至于为什么which
不同意关于要执行的二进制文件的shell,这是因为which
是一个程序,它位于/usr/bin/which
并独立于PATH
解析type
贝壳。如果您想确切了解shell的内容,请使用which
代替type -a
(并使用{{1}}查看给定命令的所有可能结果。)