我在 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
返回将要运行的命令zsh
(which
是一个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
$path
zsh
$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
确认。