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

con*_*uum 16 zsh path

我在 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
Run Code Online (Sandbox Code Playgroud)

brew在两者中

/usr/local/Cellar/zplug/HEAD-9fdb388/bin     
Run Code Online (Sandbox Code Playgroud)

usr/local/bin/brew
Run Code Online (Sandbox Code Playgroud)

这通过运行which -a brew返回来确认:

/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew   
/usr/local/bin/brew
Run Code Online (Sandbox Code Playgroud)

但是当我运行which brew它返回时:

/usr/local/bin/brew
Run Code Online (Sandbox Code Playgroud)

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

当 brew 在路径中较早时怎么会发生这种情况?

帮助表示赞赏。

Sté*_*las 26

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

Whilewhich cmd返回zsh将运行的命令(which是一个zsh类似于 intcsh但与大多数其他 shell 不同的内置命令)。

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

可以使用命令(标准 POSIX shell 命令)操作该哈希表(在 中的$commands关联数组中公开)。zshhash

如果您已经运行了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 忘记记住的命令(使缓存无效),以便下次查找并在新位置找到它。