Ho uno script bash che usa in set -o errexit
modo tale che per errore l'intero script esca nel punto di errore.
Lo script esegue un curl
comando che a volte non riesce a recuperare il file previsto, tuttavia quando ciò si verifica lo script non esce.
Ho aggiunto un for
loop a
- mettere in pausa per alcuni secondi, quindi ripetere il
curl
comando - utilizzare
false
nella parte inferiore del ciclo for per definire uno stato di uscita predefinito diverso da zero - se il comando arricciatura ha esito positivo - il ciclo si interrompe e lo stato di uscita dell'ultimo comando deve essere 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 .....
Il problema è quando il curl
comando fallisce, il ciclo ritenta il comando cinque volte - se tutti i tentativi falliscono il ciclo for termina e lo script principale riprende - invece di innescare il comando errexit
.
Come posso ottenere la chiusura dell'intero script se questa curl
affermazione fallisce?
true
prima dell'istruzione break per essere espliciti e garantire il valore di uscita del ciclo?