如果命令以代码 143 退出(超时,来自“超时命令”),我试图返回 0 退出代码,否则返回 1。由于外部约束(CI 脚本),我必须启动命令并在 if 子句中进行检查。
这是我目前使用的:
if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi
目前,它总是以 0 代码退出。
如果命令以代码 143 退出(超时,来自“超时命令”),我试图返回 0 退出代码,否则返回 1。由于外部约束(CI 脚本),我必须启动命令并在 if 子句中进行检查。
这是我目前使用的:
if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi
目前,它总是以 0 代码退出。
您的脚本没有执行您想要的操作,因为当退出状态为 0(在 shell 脚本中被视为 true 的退出状态)时,该命令刚刚以退出状态 0 完成并且不会导致正确-要运行的手边。同样,如果您替换为,则左侧的任何非零退出状态都将是整个命令的退出状态,而右侧将不会运行。
timeout -t 10 command
timeout -t 10 command || [ $? = 143 ]
||
||
&&
您应该将它们作为两个单独的命令运行,用 a
;
或换行符分隔它们。如有必要,您仍然可以在if
执行此操作时将它们都用作条件(见下文)。我假设这是您需要的退出状态,而不是(如果不同)。否则我不清楚你想要什么;像 ilkkachu 一样,我不熟悉接受选项的命令。通常我会建议你这样做,除了听起来你的“外部约束”可能会禁止它,因为它根本不使用:
timeout -t 10 command
command
timeout
-t
if
test
/命令返回退出代码 0 表示真,[
返回 1 表示假,这就是您不必用exit 0
和编写单独分支的原因exit 1
。内置函数在exit
不带参数运行时会导致 shell 返回最后一个运行命令的退出状态。如果您已经在脚本的末尾,那么您可以省略
exit
,因为当控制从脚本的末尾流出时,它具有与以下相同的效果exit
:(在任何一种情况下,您都可以根据自己的喜好编写
[ "$?" -eq 143 ]
。test "$?" -eq 143
有关[
/test
用法的详细信息,请参见下文。)尽管您的描述听起来好像您不能完全使用该代码,但您仍然应该能够修改它以采用所需的形式。您说您不仅必须进行检查,而且还必须启动
if
子句中的命令。这似乎禁止了Hauke Laging 建议的在if
.因此,如果您不能这样做,那么您可以
if
像以前一样在条件中包含该命令,但使用 a而不是 a将其与您的test
/[
命令分开:;
||
(你可以省略
"
"
周围$?
。你也可以用写作=
代替143
,尽管它是令人困惑的,因为它=
表示文本而不是数字比较。你可以写test "$?" -eq 143
而不是[ "$?" -eq 143 ]
如果你喜欢。)这样做的原因是您可以编写一个
if
条件,该条件由多个用分号甚至换行符分隔的命令组成。这就是为什么 shell 语法要求你写then
来指示if
条件的结束。因此,当您的目标是运行两个命令作为条件而只测试第二个命令时,您不必尝试迂回使用&&
or运算符。||
if
if
请注意,我只是建议这样做,因为您说它必须全部处于这种
if
状态。我不建议您在不需要时编写这样的脚本。