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。
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)
小智 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
| 归档时间: |
|
| 查看次数: |
29939 次 |
| 最近记录: |