与大多数用户一样,我设置了一堆别名,为常用程序提供一组默认标志。例如,
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-alias
type
在这种情况下,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
中的工作方式相同zsh
bash
例如在我的 Mac 上:
LOLcalhost :: ~ % command which grep
/usr/local/bin/grep