zsh和bash中which命令的不同行为

5

我使用zsh和oh-my-zsh框架已经有一段时间了,我注意到which命令在zsh中的行为与bash不同。

我的意思是:

# on zsh
ilias@ilias-pc ~  ➜ which ls
ls: aliased to ls --color=auto
ilias@ilias-pc ~  ➜ which which
which: shell built-in command
ilias@ilias-pc ~  ➜ bash
[ilias@ilias-pc ~]$ which ls
/usr/bin/ls
[ilias@ilias-pc ~]$ which which
/usr/bin/which
[ilias@ilias-pc ~]$ 

为什么会发生这种情况,我应该如何“修复”它?
PS。 我在Arch Linux上重现了这个问题(不确定是否有影响但我提到了它)。

可能是 https://dev59.com/92sz5IYBdhLWcg3wsaAN 的重复问题。 - cmh
2个回答

11
在ZSH中,which相当于whence -c(显示函数定义),而不是whence -p(告诉可执行路径)。如果你要改变这个行为,请创建一个别名。

10
$ zsh -c 'type which'
which is a shell builtin
$ bash -c 'type which'
which is /usr/bin/which

解决方案是不要使用非标准且不太有用的which(1)命令。由于替代方案规范不清且实现不一致,你应该使用哪个并不是最简单的问题,但它们比which更好。
根据你的需求,你可以使用command(查看-v选项),typewhence。前两者请参阅POSIX,后者请参考你的Shell手册。(Bash不支持whence,但大多数其他ksh衍生版本都支持它,尽管它通常具有最多的功能)。

值得注意的是:在zsh文档中,所有其他事物(包括command -v)都被标记为等同于whence(可能带有一些标志):这是whence具有最多功能的完美例子。 - ZyX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接