zsh 运行命令但不是从路径

Ale*_*x Q 2 linux zsh shell path

我的 zsh 正在做一些奇怪的事情,它运行的可执行文件不是我路径上的第一个可执行文件。我有一个用于 ssh 的包装器脚本,但是在调用真正的 ssh 二进制文件时没有调用包装器。

一些诊断:

$ echo $SHELL
/bin/zsh

$ echo $PATH
/home/user1/bin:/home/user1/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/sbin:/usr/X11R6/bin:/usr/X11/bin:/usr/kerberos/bin

$ which ssh
~/bin/ssh

$ builtin which -a ssh
/home/user1/bin/ssh
/usr/bin/ssh

$ alias
l.='ls -d .* --color=tty'
ll='ls -lh'
ls='ls --color=auto'
run-help=man
vi=vim
which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
which-command=whence
zcp='noglob zmv -W -C'
zln='noglob zmv -W -L'
zmv='noglob zmv -W -M'
Run Code Online (Sandbox Code Playgroud)

我尝试在 bash 中运行 'ssh' 并调用了我的包装器脚本,所以这似乎是 zsh 的问题。

如果需要任何其他诊断信息,请现在告诉我。

我真的很想知道为什么当我尝试调用 ssh 时 $PATH 变量被忽略了。

更新 1

添加了'builtin which -a ssh'的输出

小智 5

在信息页面中,zsh 使用哈希表来存储可执行文件的路径。我猜你是按这个顺序做的。

  1. 启动 zsh 会话
  2. 运行标准 ssh,这会将路径存储在哈希表中。
  3. 创建包装脚本。
  4. Ran ssh,这从哈希表中选择了错误的(过时的)路径。
  5. Ran which ssh,这只是检查 PATH,而不是 zsh 哈希表。

zsh 的信息页面建议hash -r将清除哈希表,之后将重建哈希表,这将获取您的包装器脚本。

当您启动 bash 时,它没有共享路径的 zsh 内部哈希,因此它只是开始在 PATH 中查找以查找内容。