1

У меня есть функция bash на одном из наших тестовых серверов, которая развертывает наш код, но одна из команд часто дает сбой, и мы не можем найти причину. Мы просто повторяем, пока это не сработает.

Я хочу повторить функцию, если эта команда не удалась. В функции я сделал что-то вроде этого:

command_to_run || { echo "failed, retrying"; call_function; }

Который вызывает функцию снова, как я хотел бы, но также позволяет функции продолжать выполнение. Как мне остановить выполнение текущей функции перед ее повторным вызовом?

3 ответа3

7

Вот еще более простой вариант предложения @ terdon:

while ! command_to_run; do
    echo "failed, retrying"
    sleep 1
done

while самом деле принимает команду, поэтому он может проверить успешность / неудачу команды command_to_run напрямую, а не иметь дело с $? , Обычно, while выполняется цикл, пока команда выполняется успешно; в этом случае я использую ! отрицать это и запускать цикл до тех пор, пока команда не будет выполнена (то есть, пока она не будет выполнена).

4

Попробуйте цикл while:

er=1; while [[ $er != 0 ]]; do command_to_run; er=$?; sleep 1; done

Bash сохраняет состояние выхода последней команды в специальной переменной $? , Приведенный выше цикл сохраняет состояние выхода command_to_run как $er а затем повторно запускает команду до тех пор, пока не будет возвращено состояние выхода 0 (правильное завершение). Он будет ждать одну секунду между запусками, как предложено Flup в комментариях ниже.

0

Я нахожу until более читабельным в этом случае.

until command_to_run; do
    echo "failed, retrying"
    sleep 1
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .