Ich habe ein Bash-Skript, das verwendet, set -o errexitdamit bei einem Fehler das gesamte Skript zum Zeitpunkt des Fehlers beendet wird.
Das Skript führt einen curlBefehl aus, mit dem die gewünschte Datei manchmal nicht abgerufen werden kann. In diesem Fall tritt jedoch kein Fehler beim Beenden des Skripts auf.
Ich habe eine forSchleife hinzugefügt
- Machen Sie eine kurze Pause und wiederholen Sie den
curlBefehl - Verwenden Sie
falseam Ende der for-Schleife, um einen Standard-Ausgangsstatus ungleich Null zu definieren. Wenn der curl-Befehl erfolgreich ausgeführt wurde, wird die Schleife unterbrochen und der Ausgangsstatus des letzten Befehls sollte Null sein.
#! /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 .....
Das Problem ist, wenn der curlBefehl fehlschlägt, die Schleife den Befehl fünfmal wiederholt - wenn alle Versuche erfolglos sind, wird die for-Schleife beendet und das Hauptskript wird fortgesetzt -, anstatt den Befehl auszulösen errexit.
Wie kann ich das gesamte Skript beenden, wenn diese curlAnweisung fehlschlägt?
truedie break-Anweisung explizit voranzustellen und den Exit-Wert der Schleife sicherzustellen?