Ich verwende set -e
um das Bash-Skript beim ersten Fehler zu stoppen.
Alles funktioniert OK, es sei denn, ich verwende den Befehl mit &&
:
$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$
verglichen mit:
$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$
Das erste Beispiel wiederholt immer noch I'm running!
, aber der zweite nicht. Warum verhalten sie sich anders?
UPD. Ähnliche Frage:https://stackoverflow.com/questions/6930295/set-e-and-short-tests
Akzeptierte Antwort:
Dies ist ein dokumentiertes Verhalten.
Die Manpage bash(1) sagt für set -e
,
Die Shell wird nicht beendet, wenn der fehlgeschlagene Befehl
Teil der Befehlsliste
unmittelbar nach einem while
ist oder until
Schlüsselwort,
Teil des Tests nach if
oder elif
reservierte Wörter, Teil eines beliebigen Befehls, der in einem &&
ausgeführt wird oder ||
Liste außer dem Befehl nach dem abschließenden &&
oder ||
,
jedem Befehl in einer Pipeline außer dem letzten,
oder wenn der Rückgabewert des Befehls mit !
invertiert wird .
[Hervorhebung hinzugefügt.]
Und die POSIX Shell Command Language Die Spezifikation bestätigt, dass dies das richtige Verhalten ist:
Das -e
Die Einstellung soll ignoriert werden
wenn die zusammengesetzte Liste
nach dem while
ausgeführt wird , until
,if
, oder elif
reserviertes Wort,
eine Pipeline, die mit !
beginnt reserviertes Wort,
oder irgendein Befehl einer UND-ODER-Liste außer dem letzten.
und Abschnitt 2.9.3 Listen dieses Dokuments definiert
Eine UND-ODER-Liste ist eine Folge von einer oder mehreren Pipelines
, die durch die Operatoren „&&
getrennt sind “ und „||
“.