/bin/sh 在 if 语句中没有找到命令时返回 0,这是预期的吗?

Ale*_*lke 0 shell c++ error-handling

我编写了一个 C++ 看门狗,它运行一组脚本来确定该系统是否存在问题。

代码有点啰嗦,这里就不展示了,不过相当于一个系统调用如下:

int const r(system("/bin/sh /path/to/script/test-health"));
Run Code Online (Sandbox Code Playgroud)

只有,r当脚本因if语句中缺少命令而失败时为 0 。脚本中有一个令人反感的地方:

set -e
[...]
if unknown_command arg1 arg2
then
[...]
Run Code Online (Sandbox Code Playgroud)

unknown_command明显失败,因为......它是未知的。那时脚本结束,因为我set -e在开头有 。

但是,在这种情况下,退出代码将为 0。

在这种情况下,有没有办法让我获得退出代码 1?

即问题是检测错误而不必添加测试来知道是否unknown_command存在。我知道该怎么做:

if ! test -x unknown_command
then
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)

我的观点是,当我编写该脚本时,我希望unknown_command在我自己安装它时存在,但是如果出现问题或有人将脚本复制到另一个系统上而没有安装所有内容,我想知道我在执行脚本。

Kus*_*nda 5

从 POSIX 标准,关于set -e

-e设置应执行以下化合物列表时被忽略whileuntilif,或elif保留字,管道期初!保留字,或小于最后的其他与或列表的任何命令。

这意味着在if语句中执行未知命令不会导致脚本在set -e. 或者更确切地说,set -e不会导致它终止。


用户command -v测试当前 中是否存在实用程序PATH,除非您使用您调用的实用程序的完整路径,在这种情况下,-x测试就足够了,如您的问题。

另请参阅: 为什么不使用“which”?那用什么?