我在 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 cmd
cmd
在目录中查找所有命名为您具有执行权限的常规文件$path
(除了别名、函数、内置函数...)。
Whilewhich cmd
返回zsh
将运行的命令(which
是一个zsh
类似于 intcsh
但与大多数其他 shell 不同的内置命令)。
zsh
,与大多数其他 shell 一样,它会记住hash
表中可执行文件的路径,以便$path
每次调用它们时不必在所有目录中查找它们。
可以使用命令(标准 POSIX shell 命令)操作该哈希表(在 中的$commands
关联数组中公开)。zsh
hash
如果您已经运行了brew
(或者命令which/type/whence brew
,将有致敏散列/缓存,或使用的命令完成或任何东西),然后将其加入/usr/local/Cellar/zplug/HEAD-9fdb388/bin
或之前/usr/local/Cellar/zplug/HEAD-9fdb388/bin
加入$path
,zsh
就会想起它的路径,并将其存储为$commands[brew]=/usr/local/bin/brew
。
在这种情况下,您可以使用hash -r
(如在 Bourne shell 中)或rehash
(如在 csh 中)zsh
忘记记住的命令(使缓存无效),以便下次查找并在新位置找到它。