which
我之前曾因不同平台(Linux 与 Solaris vx.OS X)上的命令 输出差异而感到沮丧,不同的 shell 也可能会影响到这个问题。type
已被建议作为更好的替代方案,但它的便携性如何?
过去,我编写了一些函数来解析输出which
并处理我遇到的不同用例。它们可以在我使用的机器上工作,因此对于我的个人脚本来说是可以的,但是对于我要发布到其他地方供其他人使用的软件来说,这似乎非常不可靠。
仅举一个可能的例子,假设我必须从脚本中检测 bash 和 zsh 在计算机上是否可用,然后使用 zsh 运行命令(如果存在),如果 zsh 不存在且 bash 足够用,则使用 bash 运行命令。版本没有特定的错误。脚本的其余部分大部分可以是 Bourne shell 或 Ruby 或其他任何东西,但是这一特定的事情必须使用 zsh 或最新版本的 bash 来完成(据我所知)。
我可以指望type
跨平台可用吗?是否有其他替代方案which
可以轻松一致地回答是否安装特定软件的问题?
(如果您还想提供与我给出的示例具体相关的想法,那很好,但我主要只是询问一般情况:找出给定计算机上是否安装了特定内容的最可靠方法是什么?)
答案1
在 21 世纪,特别是如果您的目标机器可能有 bash 或 zsh,那么您可以放心type
使用。 (它并不存在于极其古老的 unice 中,例如 1970 年代或 1980 年代初。)您不能指望它的输出有任何意义,但您可以指望它返回 0 如果有一个名为该名称的命令并且否则非零。
which
不是标准的并且在实践中是不可靠的。type
是推荐的替代方案。whereis
遇到同样的问题which
并且不太常见。whence
特定于 ksh 和 zsh。
如果可能的话,测试命令是否存在并测试其行为是否看起来合理会更可靠。例如,通过运行测试是否存在合适版本的 bash bash -c 'somecommand'
,例如
# Test for the `-v` operator (which appeared in bash 4.2)
if bash -c 'test -v HOME' 2>/dev/null; then …
今天,您可以信赖几乎所有内容Single UNIX 规范版本 2(除了 Fortran 和 SCCS 等外来的东西,无论如何它们都是可选的)。您可以信赖大多数版本3也是如此,但这还没有在所有地方完全实施。版本4支持比较粗略。如果您要阅读这些规范,我建议您阅读版本 3,它比版本 2 更具可读性且更明确。
有关如何检测系统特性的示例,请参见自动配置以及configure
各种软件的脚本。
也可以看看可移植 shell 编程的资源了解更多提示。