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

use*_*695 2 bash shell-script

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

if command kubectl cluster-info > /dev/null; then
    # sudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
    # ...
fi
Run Code Online (Sandbox Code Playgroud)

Kam*_*ski 7

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

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

来源

command内建没有太大变化:

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

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

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

来源

您的示例已修改:

command kubectl cluster-info >/dev/null 2>&1
if [ "$?" -eq 127 ]; then …
Run Code Online (Sandbox Code Playgroud)

还有type

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

来源

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

但是在 Bash中毫无疑问:

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

有一些有用的选项:

如果-t使用选项,type打印单个字是一个aliasfunctionbuiltinfilekeyword,如果名字是别名,壳的功能,外壳内置,磁盘文件,或壳保留字,分别。如果未找到名称,则不打印任何内容,并type返回失败状态。

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

通过检查type -t kubectl和/或的输出和退出状态type -p kubectl,您可以在kubectl 调用它的情况下讲述一些事情。

不过,事先说查不到kubectl,作为一个命令一起使用时,会被解释为一个文件运行并不意味着它是 kubectl你需要的。