我编写了一个 C++ 看门狗,它运行一组脚本来确定该系统是否存在问题。
代码有点毛茸茸,这里就不展示了,但它相当于一个系统调用,如下所示:
int const r(system("/bin/sh /path/to/script/test-health"));
仅r
当脚本因if
语句中缺少命令而失败时为 0。脚本有一些令人反感的地方:
set -e
[...]
if unknown_command arg1 arg2
then
[...]
显然失败了,unknown_command
因为......它是未知的。那时脚本结束,因为我set -e
在开始时有。
但是,在这种情况下,退出代码将为 0。
在这种情况下,我有办法获得退出代码 1 吗?
即问题是检测错误而无需添加测试来知道是否unknown_command
存在。我知道该怎么做:
if ! test -x unknown_command
then
exit 1
fi
我的观点是,当我编写该脚本时,我希望unknown_command
在我自己安装它时存在,但如果出现问题或有人将脚本复制到另一个系统上而不安装所有内容,我想知道执行时出错脚本。
根据 POSIX 标准,关于
set -e
:if
这意味着在语句中执行未知命令不会导致脚本在运行时终止set -e
。或者更确切地说,set -e
不会导致它终止。用户
command -v
测试当前是否存在实用程序PATH
,除非您使用调用的实用程序的完整路径,在这种情况下,-x
测试就足够了,就像您的问题一样。另请参阅: 为什么不使用“which”?那该用什么?
这是一个谎言。
常用脚本:
您说您知道如何测试未知命令。
Almquist 外壳为
/bin/sh
:Korn 壳为
/bin/sh
:Bourne Again shell 为
/bin/sh
:Z外壳为
/bin/sh
:由于您的问题是询问如何避免一开始就没有发生的事情,并且将虚假作为其前提和标题,因此无法回答。
if
不退出,因为已set -e
设置:打印(在所有测试的 shell 中,错误消息的变化):
设置或未
set -e
设置。如果要检测丢失的命令,请捕获退出代码 127 1:
这将执行如下:
1
关于127的退出码
你应该做以下两件事之一:
1:
然后如果失败
set -e
将导致脚本终止。unknown_command
你为什么说if
?2: