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

Adr*_*scu 90 shell zsh alias which

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

alias vim='vim -X'
alias grep='grep -E'
alias ls='ls -G'
Run Code Online (Sandbox Code Playgroud)

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

$ which vim
vim: aliased to vim -X
Run Code Online (Sandbox Code Playgroud)

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

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

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

gee*_*aur 126

which这样做实际上是一种糟糕的方式,因为它会根据$SHELLshell 使用的启动文件(它认为)来猜测您的环境;它不仅有时会猜错,而且您通常无法告诉它表现出不同的行为。(例如,which在我的 Ubuntu 10.10 上不理解--skip-alias@SiegeX 所提到的。) type使用当前的 shell 环境而不是查看您的配置文件,并且可以被告知忽略该环境的一部分,因此它向您展示了实际情况发生而不是在重建默认 shell 时会发生什么。

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

$ type -P vim
/usr/bin/vim
Run Code Online (Sandbox Code Playgroud)

您还可以要求它一次剥离所有层,然后向您展示它会发现什么:

$ type -a vim
vim is aliased to `vim -X'
vim is /usr/bin/vim
Run Code Online (Sandbox Code Playgroud)

(从评论中对此进行扩展:)

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

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

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

  • 谢谢!这是添加到我的技巧包中非常有用的东西。我特别喜欢 `type -a` 似乎在你的 `$PATH` 上返回 *all* 实例,而不仅仅是第一个。我想我会将 `which` 别名为 `type` :) (8认同)
  • `type -p` 在 zsh 和 bash 之间的行为不同。`type -P` 在 zsh 中根本不存在。 (4认同)
  • @geekosaur:谢谢。如果 `type` 是 POSIX 标准的一部分,那么这就是要走的路。要回答我的问题,请在 zsh 上输入也适用(在 Debian 上)。如果发行版没有标准化并且没有额外的功能,为什么不去掉 `what` 和 `which`? (2认同)

Mik*_*kel 17

bash

type -P vim
Run Code Online (Sandbox Code Playgroud)

zsh

type -p vim
Run Code Online (Sandbox Code Playgroud)

同时:

/usr/bin/which vim
Run Code Online (Sandbox Code Playgroud)

或者:

( unalias vim; type vim )
Run Code Online (Sandbox Code Playgroud)

  • 最后一张很酷 我们可以有一个别名来做到这一点。:) (2认同)

小智 6

在 zsh 中which是一个内置命令,因为此命令报告:

$ whence -w which
which: builtin
Run Code Online (Sandbox Code Playgroud)

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

$ /bin/which ls; echo $?
/bin/ls
0
Run Code Online (Sandbox Code Playgroud)

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

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

$ whence -p ls
/bin/ls
Run Code Online (Sandbox Code Playgroud)

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

$ alias dire='ls -l'
Run Code Online (Sandbox Code Playgroud)

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

$ whence -p dire; echo $?
1
Run Code Online (Sandbox Code Playgroud)

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