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

Dre*_*mor 0 shell-script ash exit-status

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

这是我目前使用的:

if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi
Run Code Online (Sandbox Code Playgroud)

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

Eli*_*gan 6

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

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

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

timeout -t 10 command
test "$?" -eq 143
exit
Run Code Online (Sandbox Code Playgroud)

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

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

timeout -t 10 command
test "$?" -eq 143
Run Code Online (Sandbox Code Playgroud)

(无论哪种情况,如果您愿意,您都可以写[ "$?" -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
Run Code Online (Sandbox Code Playgroud)

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

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

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