像大多数用户一样,我设置了一堆别名来为常用程序提供一组默认标志。例如,
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 上。那里是否存在类似的东西?
之前我一直对which不同平台(Linux 与 Solaris vx. OS X)的命令输出差异感到沮丧,不同的 shell 也可能会影响到这个问题。 type已被建议作为更好的替代方案,但它的便携性如何?
过去,我编写了一些函数来解析which我遇到的不同用例的输出并处理它们。它们可以在我使用的机器上工作,因此对于我的个人脚本来说还可以,但是对于我要发布给其他人使用的软件来说,这似乎非常不可靠。
举一个可能的例子,假设我必须从脚本中检测 bash 和 zsh 在一台机器上是否可用,然后使用 zsh 运行命令(如果存在),如果 zsh 不存在并且 bash 足够,则使用 bash版本没有特定的错误。脚本的其余大部分可能是 Bourne shell 或 Ruby 或其他任何东西,但是必须使用 zsh 或最新版本的 bash 完成这一特定的事情(AFAIK)。
我可以指望type跨平台可用吗?是否有其他替代方案which可以轻松且一致地回答是否安装了特定软件的问题?
(如果你还想给出与我给出的例子特别相关的想法,那很好,但我主要只是询问一般情况:找出特定机器上是否安装了特定东西的最可靠方法是什么? ?)