(从脚本)检测软件是否已安装的最佳方法是什么?

(从脚本)检测软件是否已安装的最佳方法是什么?

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 编程的资源了解更多提示。

相关内容