如何检查 bash 中的失败命令?

如何检查 bash 中的失败命令?

我需要通过 bash 脚本检查 kubernetes 是否已安装。如果不是,我将开始我的设置程序。我认为最好检查是否kubectl cluster-info有输出。如何检查失败的命令?

if command kubectl cluster-info > /dev/null; then
    # sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
    # ...
fi

答案1

sh兼容的 shell 中,不存在的命令的退出状态应为127

如果未找到命令,则退出状态为127。如果找到命令名称,但它不是可执行实用程序,则退出状态应为126

来源

内置command没有太大变化:

[...]应返回以下退出值:

126
已找到指定的实用程序 [...],但无法调用。

127
命令实用程序中发生错误或无法找到指定的 [...] 实用程序。

来源

您的示例已修改:

command kubectl cluster-info >/dev/null 2>&1
if [ "$?" -eq 127 ]; then …

还有type

type实用程序应指示如果用作命令名称,每个参数将如何解释。

来源

POSIX 没有指定输出的确切格式。退出状态仅需要区分错误和成功。尚不清楚是否成功找到提供的命令不存在。

然而在重击中毫无疑问:

如果找到所有名称,则返回状态为零;如果未找到任何名称,则返回状态为非零。

有一些有用的选项:

如果-t使用该选项,type则打印一个单词,该单词是aliasfunction、或 之一(如果 name 分别是别名、shell 函数、shell 内置函数、磁盘文件或 shell 保留字)builtin。如果未找到该名称,则不会打印任何内容,并返回失败状态。filekeywordtype

如果-p使用该选项,则 type 要么返回将要执行的磁盘文件的名称,如果-t不返回则不返回任何内容file

type -t kubectl通过检查和/或 的输出和退出状态type -p kubectl,您可以了解一些信息kubectl 没有调用它。

尽管如此,提前发现kubectl,当用作命令时,将被解释为要运行的文件并不意味着它是 kubectl你需要。

答案2

现有的答案接近我需要的,但对我来说,将所有现有的答案放在一起后,以下内容有效:

if type kubectl &> /dev/null; then
  source <(kubectl completion bash)
fi

如果没有&符号,输出仍然显示在终端中。

相关内容