GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Abbrechen eines Shell-Skripts, wenn ein Befehl einen Wert ungleich Null zurückgibt

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

Linux
  1. Shell-Script-Wrapper, um das Ausführen von Befehlen ohne Argumente zu verhindern?

  2. Shell-Skript hängt am Mail-Befehl?

  3. Wie kann man feststellen, ob die Ausgabe eines Befehls oder Shell-Skripts Stdout oder Stderr ist?

  4. Verwenden des passwd-Befehls innerhalb eines Shell-Skripts

  5. Legen Sie die Umgebungsvariable im Shell-Skript/Zugriff in der Tomcat-Anwendung fest

Einfaches Verständnis von Shell-Befehlen mit dem Skript „Explain Shell“ in Linux

So führen Sie einen Linux-Shell-Befehl / ein Skript im Hintergrund aus

So speichern Sie einen Linux-Befehl als Variable im Shell-Skript

Wie übergibt man ein Befehlszeilenargument an ein Shell-Skript?

Wie führe ich einen Befehl in einem Shell-Skript aus?

Führen Sie ein Shell-Skript über den Befehl docker-compose im Container aus