Mam skrypt bash, który używa, set -o errexit
więc po błędzie cały skrypt kończy się w momencie awarii.
Skrypt uruchamia curl
polecenie, które czasami nie może pobrać zamierzonego pliku - jednak gdy to nastąpi, skrypt nie kończy błędu.
Dodałem for
pętlę do
- zatrzymaj się na kilka sekund, a następnie ponów
curl
komendę - użyj
false
na dole pętli for, aby zdefiniować domyślny niezerowy status wyjścia - jeśli polecenie curl się powiedzie - pętla się zepsuje, a status wyjścia ostatniego polecenia powinien wynosić zero.
#! /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 .....
Problem polega na tym, że gdy curl
polecenie się nie powiedzie, pętla ponawia polecenie pięć razy - jeśli wszystkie próby zakończą się niepowodzeniem, pętla for kończy się, a skrypt główny jest wznawiany - zamiast wyzwalania errexit
.
Jak sprawić, by cały skrypt zakończył działanie, jeśli curl
instrukcja się nie powiedzie?
true
przed instrukcją break, aby była jawna i zapewniła wartość wyjściową pętli?