我在 osx 上使用 zsh (随 homebrew 安装的 5.4.2_1 )有一些奇怪的行为,没有使用路径中第一次出现的可执行文件。
这是场景:
echo $PATH
返回:
/usr/local/Cellar/zplug/HEAD-9fdb388/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
brew在两者中
/usr/local/Cellar/zplug/HEAD-9fdb388/bin
和
usr/local/bin/brew
这可以通过运行which -a brew返回来确认:
/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew
/usr/local/bin/brew
但是当我运行which brew它返回时:
/usr/local/bin/brew
并且brew确实运行/usr/local/bin/brew
而不是/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew
当 brew 在路径中较早时怎么会发生这种情况?
帮助表示赞赏。
which -a cmd
cmd
在目录中查找您对其具有执行权限的所有常规文件$path
(除了别名、函数、内置...)。While
which cmd
返回zsh
将运行的命令(与大多数其他 shell 不同which
,它是内置的zsh
) 。tcsh
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
$path
zsh
$commands[brew]=/usr/local/bin/brew
在这种情况下,您可以使用
hash -r
(如在 Bourne shell 中)或rehash
(如在 csh 中)zsh
忘记记住的命令(使缓存无效),以便下次查找并在新位置找到它。/usr/local/bin/brew
通常是一个符号链接。所以
/usr/local/bin/brew
和/usr/local/Cellar/zplug/HEAD-9fdb388/bin/brew
可能是相同的文件。
类型:
确认。