如何处理 Bash 函数中命令失败?

如何处理 Bash 函数中命令失败?

我在一台部署代码的测试服务器上有一个 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

相关内容