Ich habe ein Bash-Skript, das verwendet, set -o errexit
damit bei einem Fehler das gesamte Skript zum Zeitpunkt des Fehlers beendet wird.
Das Skript führt einen curl
Befehl 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 for
Schleife hinzugefügt
- Machen Sie eine kurze Pause und wiederholen Sie den
curl
Befehl - Verwenden Sie
false
am 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 curl
Befehl 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 curl
Anweisung fehlschlägt?
true
die break-Anweisung explizit voranzustellen und den Exit-Wert der Schleife sicherzustellen?