在什么情况下将不使用在路径中首先找到的可执行文件


15

我在osx上使用zsh(5.4.2_1和homebrew一起安装)有一些奇怪的行为,没有在路径中首次使用可执行文件。

这是场景:

echo $PATH 返回:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

两者都 酿造

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     

usr/local/bin/brew

通过运行哪个-a brew返回以下内容可以确认这一点:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew

但是当我运行哪种冲泡时,它会返回:

/usr/local/bin/brew

而且酿造确实运行/usr/local/bin/brew而不是/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

当酿造走得更早时,这怎么会发生?

帮助表示赞赏。


7
rehash如果它仍然发生之后, -并再次运行那些编辑该英寸
迈克尔·荷马

@MichaelHomer:是的。在这里体验。
约书亚记

Answers:


25

which -a cmdcmd在目录中查找所有具有执行权限的常规文件$path(除了别名,函数,内建文件...)。

虽然which cmd返回该命令zsh将运行(which在一个内置的zshtcsh,但不像大多数其它炮弹)。

zsh,就像大多数其他Shell一样,它会记住hash表中可执行文件的路径,从而不必在$path每次调用它们时都在所有目录中查找它们。

哈希表(在中的$commands关联数组中公开zsh)可以通过hash命令(标准POSIX shell命令)进行操作。

如果您已经运行了brew(或者命令which/type/whence brew,将有致敏散列/缓存,或使用的命令完成或任何东西),然后将其加入/usr/local/Cellar/zplug/HEAD-9fdb388/bin或之前/usr/local/Cellar/zplug/HEAD-9fdb388/bin加入$pathzsh就会想起它的路径,并将其存储为$commands[brew]=/usr/local/bin/brew

在这种情况下,您可以使用hash -r(如在Bourne shell中)或rehash(如在csh中)zsh 忘记已记住的命令(使该cache无效),以便下次可以查找它并在新位置找到它。


谢谢-这解决了问题。我应该能够回应$ command [brew]-什么都看不到吗?
连续性

1
@continuum,对不起,我不好$commands,不是$command。参见编辑。
斯特凡Chazelas

0

/usr/local/bin/brew 通常是一个符号链接。

所以,/usr/local/bin/brew/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew

可能是相同的文件。

类型:

ls -al /usr/local/bin/brew

确认。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.