bash script: повторити команду, якщо вона повертає помилку


23

Я хотів би створити цикл, який повторює передачу ncftp, якщо він повертає помилку.

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

until [$? == 0]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
done

Відповіді:


40

Я знайшов основу для цього елегантного циклу в іншому місці на сервері за замовчуванням. Виявляється, немає необхідності зберігати вихідний код, оскільки ви можете перевірити безпосередньо команду;

until ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file; do
  echo Tansfer disrupted, retrying in 10 seconds...
  sleep 10
done

8

Майже. Ви, ймовірно, краще зберігаєте повернене значення у вигляді змінної, щоб ви могли попередньо встановити його перед циклом. Інакше на нього вплине команда останнього запуску.

Можливо, ви також захочете перев’язати sleepтам, щоб зупинити його занадто швидке розмноження.

RET=1
until [ ${RET} -eq 0 ]; do
    ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file
    RET=$?
    sleep 10
done

Я думаю, забув передати код виходу до змінної RET, але я розумію. Моє головне питання - коли буде оцінено пункт до? У C він не буде оцінюватися до моменту першого запуску циклу, і в цьому випадку мій цикл повинен працювати. Але все-таки краще, оскільки це дозволяє проміжні команди, такі як сон. Спасибі!
Рой

Добре помічений. Я це відредагував. Стаття буде оцінена до першого запуску. Отже, раніше він використовував би код повернення будь-якої попередньої команди. Подвійні рівні не застосовуються Башем, але це робить хорошу практику використання.
Ден Карлі

== для рівності рядків не числовий, хоча я не думаю, що це має значення в цьому випадку ...
Кайл Брандт

Одинарні та подвійні рівності однакові. Але було б краще використовувати цілі рівності зараз, коли ви це згадуєте.
Ден Карлі

1
Вам не потрібно перевіряти номер повернення коду - ви можете просто протестувати код повернення самої програми - до появи програми; спати 3; зроблено.
chris

3

Трохи хакі, але моє рішення полягало в тому, щоб просто створити функцію bash, яка запускається сама, якщо вона закінчується з відмовою

function retry { the_command_you_want && echo "success" || (echo "fail" && retry) }; retry

0

Ви можете робити цикл, коли ваша команда повертає помилку:

    while [ -n $(ncftpput -DD -z -u user -p password remoteserver /remote/dir /local/file) ]; do
            sleep 1;
    done;

3
Ця відповідь потребує пояснення.
kasperd

@kasperd додано пояснення
Андрес Рівас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.