如何在别名命令上使用“which”?

如何在别名命令上使用“which”?

与大多数用户一样,我设置了一堆别名,为常用程序提供一组默认标志。例如,

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'

问题是,如果我想用它which来查看我的vim/ grep/ ls/etc 来自哪里,别名就会妨碍:

$ which vim
vim: aliased to vim -X

这是有用的输出,但不是我在这种情况下寻找的输出;我知道vim是别名vim -X,但我想知道在哪里 vim是来自。

除了暂时取消定义别名以便我可以使用which它之外,是否有一种简单的方法可以which“解开”别名并在其上运行?

编辑:这似乎which是一个 shell 内置函数,在不同的 shell 中具有不同的行为。在 Bash 中,SiegeX 的--skip-alias标志建议有效;不过,我在 Zsh 上。那里存在类似的东西吗?

答案1

which$SHELL实际上是一种不好的方法来做这样的事情,因为它根据shell 使用的启动文件(它认为)来猜测你的环境;它不仅有时会猜测错误,而且通常无法告诉它采取不同的行为。 (例如, which在我的 Ubuntu 10.10 上,不理解@SiegeX 提到的那样。)使用当前的 shell 环境而不是查看您的配置文件,并且可以被告知忽略该环境的部分内容,因此它会向您显示实际上会发生什么发生的事情,而不是重建默认 shell 时发生的事情。--skip-aliastype

在这种情况下,type -P将绕过任何别名或函数:

$ type -P vim
/usr/bin/vim

你也可以要求它剥下来全部一次一层,并向您展示它会发现什么:

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim

(根据评论对此进行扩展:)

问题是which它通常是一个外部程序而不是内置的 shell,这意味着它无法看到您的别名或函数,并且必须尝试从 shell 的启动/配置文件中重建它们。 (如果它是内置的 shell,就像它在zsh但显然不是那样bash,则更有可能使用 shell 的环境并做正确的事情。)

type是一个符合 POSIX 标准的命令,需要像内置命令一样运行(也就是说,它必须使用调用它的 shell 的环境,包括本地别名和函数),因此通常一个内置的。

它通常不在csh/中找到tcsh,尽管在大多数现代版本中它which是内置的 shell 并且做正确的事情;有时是内置的what,有时根本没有好方法来查看当前 shell 的csh环境tcsh

答案2

bash

type -P vim

zsh

type -p vim

同时:

/usr/bin/which vim

或者:

( unalias vim; type vim )

答案3

在 zsh 中which是一个内置命令,如下所示:

$ whence -w which
which: builtin

要执行外部命令(在任何 shell 中)which,使用完整路径:

$ /bin/which ls; echo $?
/bin/ls
0

因此找到了该命令ls(退出值为 0),并且位于/bin/ls

里面zsh;一种搜索方法(除了上述方法之外)外部命令是:

$ whence -p ls
/bin/ls

但是,这不会解析嵌套别名,例如:

$ alias dire='ls -l'

该命令将报告未dire找到命令。

$ whence -p dire; echo $?
1

要解决嵌套别名(手动),请参阅Resolve nested aliases to their source commands

答案4

另一种选择是,它在和command which vim中的工作方式相同zshbash

例如在我的 Mac 上:

LOLcalhost :: ~ % command which grep
/usr/local/bin/grep

相关内容