Fügen Sie dies am Anfang des Skripts hinzu:
set -e
Dadurch wird die Shell sofort beendet, wenn ein einfacher Befehl mit einem Exit-Wert ungleich Null beendet wird. Ein einfacher Befehl ist jeder Befehl, der nicht Teil eines if-, while- oder until-Tests oder Teil eines &&oder || ist Liste.
Siehe die Manpage bash(1) zum internen Befehl "set" für weitere Details.
Ich persönlich starte fast alle Shell-Skripte mit "set -e". Es ist wirklich ärgerlich, wenn ein Skript hartnäckig fortgesetzt wird, wenn etwas in der Mitte fehlschlägt und die Annahmen für den Rest des Skripts zunichte gemacht werden.
Wenn Sie beim Beenden aufräumen müssen, können Sie auch 'trap' mit dem Pseudo-Signal ERR verwenden. Dies funktioniert genauso wie das Trapping von INT oder anderen Signalen; bash gibt ERR aus, wenn irgendein Befehl mit einem Wert ungleich Null beendet wird:
# Create the trap with
# trap COMMAND SIGNAME [SIGNAME2 SIGNAME3...]
trap "rm -f /tmp/$MYTMPFILE; exit 1" ERR INT TERM
command1
command2
command3
# Partially turn off the trap.
trap - ERR
# Now a control-C will still cause cleanup, but
# a nonzero exit code won't:
ps aux | grep blahblahblah
Oder, besonders wenn Sie "set -e" verwenden, könnten Sie EXIT abfangen; Ihr Trap wird dann ausgeführt, wenn das Skript aus irgendeinem Grund beendet wird, einschließlich eines normalen Endes, Unterbrechungen, eines durch die Option -e verursachten Beendens usw.
Die if-Anweisungen in Ihrem Beispiel sind unnötig. Mach es einfach so:
dosomething1 || exit 1
Wenn Sie den Rat von Ville Laurikari befolgen und set -e
verwenden dann müssen Sie für einige Befehle möglicherweise Folgendes verwenden:
dosomething || true
Die || true
wird dafür sorgen, dass die Befehlspipeline einen true
hat Rückgabewert, auch wenn der Befehl fehlschlägt, also der -e
Option beendet das Skript nicht.
Zur akzeptierten Antwort hinzufügen:
Denken Sie daran, dass set -e
reicht manchmal nicht aus, besonders wenn man Pfeifen hat.
Angenommen, Sie haben dieses Skript
#!/bin/bash
set -e
./configure > configure.log
make
... was wie erwartet funktioniert:ein Fehler in configure
bricht die Ausführung ab.
Morgen nehmen Sie eine scheinbar triviale Änderung vor:
#!/bin/bash
set -e
./configure | tee configure.log
make
... und jetzt geht es nicht. Dies wird hier erklärt, und eine Problemumgehung (nur Bash) wird bereitgestellt:
#!/bin/bash set -e set -o pipefail ./configure | tee configure.log make