Wie kann man das Problem umgehen, dass die Bash-For-Schleife nicht beendet wird, wenn ein Unterbefehl einen Fehler ausführt?

Wie kann man das Problem umgehen, dass die Bash-For-Schleife nicht beendet wird, wenn ein Unterbefehl einen Fehler ausführt?

Ich habe eine For-Schleife in einem Shell-Skript a la:

#!/bin/bash
set -u
set -e
for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

Die Absicht besteht darin, dass die For-Schleife abbricht, wenn einer der Unterbefehle einen ähnlichen Fehler ausgibt.

Jetzt habe ich eine Problemumgehung parat: (cd $l; ./run-tests.sh) || die "Message here"zusammen mit einer geeigneten Definition von die. Allerdings frage ich mich wirklich, warum die For-Schleife nicht wie erwartet von selbst beendet wird, wie es der Befehl „set -e“ vorgibt. Im Idealfall würde ich nicht jede For-Schleife auf diese Weise als Sonderfall behandeln. :)

Antwort1

Der Grund dafür, set -edass das Programm im Fehlerfall nicht sofort beendet wird, ./run-test.shsind die folgenden Zeilen:

for l in sh rb py php java cs; do
  (cd $l; ./run-tests.sh)
done

für eine zusammengesetzte Anweisung. Der Status dieser zusammengesetzten Anweisung ist der Status der letzten Ausführung von ./run-tests.sh.

Ihre Lösung klingt für mich gut.

Antwort2

Ich habe keine Kommentarrechte, also poste ich hier. Es hängt vom Skript in run-tests.sh ab. Sind Sie sicher, dass dies einen Wert ungleich Null ergibt:

./run-tests.sh

echo $?

verwandte Informationen