我在一台部署代码的测试服务器上有一个 bash 函数,但其中一个命令经常失败,我们找不到原因。我们只能重试,直到成功为止。
如果该命令失败,我希望该函数重试。在函数中,我做了如下操作:
command_to_run || { echo "failed, retrying"; call_function; }
这会像我希望的那样再次调用该函数,但它也允许该函数继续执行。如何在再次调用之前停止当前函数的执行?
答案1
以下是@terdon 建议的一个更简单的版本:
while ! command_to_run; do
echo "failed, retrying"
sleep 1
done
while
实际上接受一个命令,因此它可以直接测试成功/失败,command_to_run
而不必处理$?
。通常,while
只要命令成功,就会运行循环;在这种情况下,我使用!
它来否定它,只要命令失败(即直到它成功),就会运行循环。
答案2
尝试一下 while 循环:
er=1; while [[ $er != 0 ]]; do command_to_run; er=$?; sleep 1; done
Bash 将最后一个命令的退出状态保存在特殊变量中$?
。上面的循环将退出状态保存command_to_run
为,然后重新运行命令,直到返回$er
退出状态(正确退出)。它会在两次运行之间等待一秒钟,如下所示0
弗卢普在下面的评论中。
答案3
我发现until
在这种情况下更具可读性。
until command_to_run; do
echo "failed, retrying"
sleep 1
done