我的 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'
我尝试在 bash 中运行“ssh”,并且我的包装器脚本被调用,所以这似乎是 zsh 的问题。
如果需要任何其他诊断信息,请立即告诉我。
我真的很想知道为什么当我尝试调用 ssh 时 $PATH 变量被忽略。
更新 1
添加了“builtin which -a ssh”的输出
答案1
从信息页面来看,zsh 使用哈希表来存储可执行文件的路径。我猜你是按照这个顺序做的。
- 启动 zsh 会话
- 运行标准 ssh,这会将路径存储在哈希表中。
- 创建包装脚本。
- 运行 ssh,这会从哈希表中挑选错误(过时)的路径。
- 运行
which ssh
,这只是检查 PATH,而不是 zsh 哈希表。
zsh 的信息页面建议hash -r
清除哈希表,然后重建哈希表并选取您的包装器脚本。
当你启动 bash 时,它不会共享 zsh 内部路径哈希,因此它只是开始在 PATH 中查找东西。