如何检查 if 语句中的命令退出代码

如何检查 if 语句中的命令退出代码

如果命令退出时代码为 143(超时,来自“超时命令”),我会尝试返回 0 退出代码,否则返回 1。由于外部约束(CI 脚本),我必须启动命令并在 if 子句中进行检查。

这是我目前使用的:

if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi

目前,它总是以 0 代码退出。

答案1

您的脚本没有执行您想要的操作,因为当退出状态为 0(在 shell 脚本中被视为 true 的退出状态)时,该命令只是以退出状态 0 完成,并且不会导致正确的结果-要运行的手侧。同样,如果您替换为,则任何timeout -t 10 commandtimeout -t 10 command || [ $? = 143 ]||||&&非零左侧的退出状态将是整个命令的退出状态,右侧将不会运行。

您应该将它们作为两个单独的命令运行;或 换行符分隔它们。如果有必要,您仍然可以使用它们作为if执行此操作时的条件(见下文)。

我假设它是 的退出状态,而不是timeout -t 10 commandcommand(如果不同),您需要的。否则我不清楚你想要什么;像伊尔卡丘,我不熟悉timeout接受-t选项的命令。通常我建议你这样做,除了听起来你的“外部约束”可能会禁止它,因为它if根本不使用:

timeout -t 10 command
test "$?" -eq 143
exit

test/命令[返回退出代码 0 表示 true,1 表示 false,这就是为什么您不必使用 和 编写单独的exit 0分支exit 1。当不带参数运行时,内置命令exit会导致 shell 返回最后运行的命令的退出状态。

如果您已经位于脚本末尾,则可以省略exit,因为当控制流离开脚本末尾时,它具有与以下相同的效果exit

timeout -t 10 command
test "$?" -eq 143

(无论哪种情况,如果您愿意,您都可以编写[ "$?" -eq 143 ]而不是编写。有关/用法的详细信息,请参阅下文。)test "$?" -eq 143[test

尽管您的描述听起来您无法完全使用该代码,但您仍然应该能够修改它以采用所需的形式。你说你不能仅仅检查但是也启动命令if条款中。这似乎禁止Hauke Laging 建议的可读且惯用的方法运行命令if

因此,如果您不能这样做,那么您可以if像您所做的那样将该命令包含在条件中,但使用a而不是 a将其与test/[命令分开:;||

if timeout -t 10 command; [ "$?" -eq 143 ]; then
    exit 0
else
    exit 1
fi

(你可以省略" "周围$?。你也可以用写作=代替143,尽管这很令人困惑,因为=它表示文本比较而不是数字比较。如果你愿意,你可以写作test "$?" -eq 143而不是[ "$?" -eq 143 ]。)

这样做的原因是您可以编写一个if由多个用分号甚至换行符分隔的命令组成的条件。这就是为什么 shell 语法要求您编写then以指示条件结束的原因if。因此,当您的目标是运行两个命令作为条件而使其自身仅测试第二个命令时,您不必尝试迂回地使用&&or运算符。||ifif

请注意,我只是建议这样做,因为你说它必须全部处于这种if状态。当您不需要时,我不建议您编写这样的脚本。

答案2

timeout -t 10 command
if [ $? -eq 143 ]; then
    exit 0
else
    exit 1
fi

相关内容