Ich verwende set -e
zu Bash - Skript auf den ersten Fehler zu stoppen .
Alle funktionieren 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
$
im Vergleich zu:
$ 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 I'm running!
hört sich immer noch an , das zweite nicht. Warum verhalten sie sich anders?
UPD. Ähnliche Frage: /programming/6930295/set-e-and-short-tests
bash
shell-script
shell
907th
quelle
quelle
cd
Befehlset -e
Verhalten überraschend ist.Antworten:
Dies ist dokumentiertes Verhalten. Die bash (1) Manpage sagt, für
set -e
,Und die POSIX - Shell Command Language Specification bestätigt , dass dies das richtige Verhalten ist:
und Abschnitt 2.9.3 Listen dieses Dokuments definiert
quelle
Die
set -e
Option hat in einigen Situationen keine Auswirkung. Dies ist das Standardverhalten und kann auf eine POSIX-kompatible Shell übertragen werden.Der fehlgeschlagene Befehl ist Teil der Pipeline:
wird gedruckt
printed
.Und nur der Ausfall der Pipeline selbst wird berücksichtigt:
druckt nichts.
Der ausgefallene Befehl Lauf in der Verbindung der folgenden Liste
while
,until
,if
,elif
reserviertes Wort, beginnend eine Rohrleitung mit dem!
reservierten Wort oder jeder Befehl als Teil&&
oder||
Liste mit Ausnahme des letzten:Der letzte Befehl schlägt immer noch fehl
set -e
betroffen zu machen :Die Subshell schlägt in einem zusammengesetzten Befehl fehl:
quelle
echo "printed"
undecho "not_printed"
in Ihren Beispielen (anstelle vonecho 1
).set -e
dass YMMV mit verschiedenen Shells und sogar verschiedenen Versionen derselben Shell beendet(false && true); echo not here
, jedoch nicht{ false && true; }; echo here
beendet wird. Ich würde nichtset -e
mit einer Kahnstange anfassen und stattdessen die richtige Fehlerbehandlung durchführen.Ich vermute, wenn-dann-Bedingung als Ganzes als wahr zu bewerten.
Ich habe es versucht
Wer gibt
Der Fehlercode wird von der if-Bedingung abgefangen, sodass die Bash das Ende der Ausführung nicht auslöst.
quelle
if ... fi