Tengo un script bash que utiliza set -o errexitpara que, en caso de error, todo el script salga en el punto de falla.
El script ejecuta un curlcomando que a veces no puede recuperar el archivo deseado; sin embargo, cuando esto ocurre, el script no sale por error.
He agregado un forbucle a
- pausa por unos segundos y luego vuelve a intentar el
curlcomando - use
falseen la parte inferior del bucle for para definir un estado de salida predeterminado distinto de cero, si el comando curl tiene éxito, el bucle se rompe y el estado de salida del último comando debería ser cero.
#! /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 .....
El problema es cuando el curlcomando falla, el ciclo vuelve a intentarlo cinco veces, si todos los intentos no tienen éxito, el ciclo for finaliza y se reanuda el script principal, en lugar de activar el errexit.
¿Cómo puedo hacer que salga el script completo si esta curldeclaración falla?
trueantes de la declaración de ruptura para ser explícito y garantizar el valor de salida del bucle?