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

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

我在 osx 上使用 zsh (使用自制程序安装的 5.4.2_1 )时遇到一些奇怪的行为,而不使用路径中第一次出现的可执行文件。

这是场景:

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

这是通过运行确认的哪个-酿造返回:

/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

当brew 位于路径较早的位置时,怎么会发生这种情况?

帮助表示赞赏。

答案1

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

whilewhich cmd返回将要运行的命令zshwhich是一个zsh类似于 in的内置命令,tcsh但与大多数其他 shell 不同)。

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

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

如果您在将命令添加到 之前或之前运行了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 忘记记住的命令(无效缓存),这样下次就可以查找并在新位置找到它。

答案2

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

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

可能是相同的文件。

类型:

ls -al /usr/local/bin/brew

确认。

相关内容