У мене є bash-скрипт, який використовує set -o errexitтак, що при помилці весь сценарій виходить у момент відмови.
Сценарій виконує curlкоманду, яка інколи не може отримати призначений файл, однак, коли це відбувається, сценарій не виходить з помилки виходу.
Я додав forцикл до
- зробіть паузу на кілька секунд, а потім повторіть
curlкоманду - використовуйте
falseвнизу циклу for для визначення статусу виходу за замовчуванням за замовчуванням - якщо команда curl успішна - цикл розривається, а статус виходу останньої команди повинен бути нульовим.
#! /bin/bash
set -o errexit
# ...
for (( i=1; i<5; i++ ))
do
echo "attempt number: "$i
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
if [ -f ~/.vim/autoload/pathogen.vim ]
then
echo "file has been retrieved by curl, so breaking now..."
break;
fi
echo "curl'ed file doesn't yet exist, so now will wait 5 seconds and retry"
sleep 5
# exit with non-zero status so main script will errexit
false
done
# rest of script .....
Проблема полягає в тому, що коли curlкоманда не працює, цикл повторює команду п'ять разів - якщо всі спроби не виконані, цикл for завершується і основний сценарій поновлюється - замість запуску errexit.
Як я можу змусити весь сценарій вийти, якщо ця curlзаява не працює?
trueперед оператором break явний і забезпечити вихідне значення циклу?