842 Stimmen

Automatisches Beenden von Bash-Shell-Skripten bei Fehlern

Ich habe einige Shell-Skripte geschrieben, und ich fände es nützlich, wenn es die Möglichkeit gäbe, die Ausführung des besagten Shell-Skripts anzuhalten, wenn einer der Befehle fehlschlägt. Siehe unten für ein Beispiel:

#!/bin/bash

cd some_dir

./configure --some-flags

make

make install

Wenn das Skript also in diesem Fall nicht in das angegebene Verzeichnis wechseln kann, dann würde es sicher nicht eine ./konfigurieren nachher, wenn sie fehlschlägt.

Ich bin mir bewusst, dass ich für jeden Befehl eine if-Prüfung durchführen könnte (was ich für eine hoffnungslose Lösung halte), aber gibt es eine globale Einstellung, die das Skript beendet, wenn einer der Befehle fehlschlägt?

2 Stimmen

Die Antwort geht an Adam für die Details zu set -e (was genau erwünscht ist). Dank auch an a_m0d für die Info über Fallen (obwohl nicht 100% relevant).

2 Stimmen

Gelten diese Antworten für sh genau so wie bash ?

1339voto

Adam Rosenfield Punkte 373807

Verwenden Sie die set -e eingebaut:

#!/bin/bash
set -e
# Any subsequent(*) commands which fail will cause the shell script to exit immediately

Alternativ können Sie auch -e in der Befehlszeile:

bash -e my_script.sh

Sie können auch deaktivieren dieses Verhalten mit set +e .

Sie können auch alle oder einige der folgenden Elemente verwenden -e -u -x y -o pipefail Optionen wie folgt:

set -euxo pipefail

-e wird im Fehlerfall beendet, -u Fehler bei undefinierten Variablen, und -o (for option) pipefail wird bei Fehlern in der Befehlszeile beendet. Einige Probleme und Umgehungsmöglichkeiten sind gut dokumentiert aquí .

(*) Anmerkung:

Die Shell macht no exit, wenn der fehlgeschlagene Befehl Teil der Befehlsliste unmittelbar nach einem während o bis Stichwort, Teil des Tests nach der wenn o elif reservierte Wörter, Teil eines beliebigen Befehls, der in einer && o || Liste mit Ausnahme des Befehls nach dem letzten && o || einen beliebigen Befehl in einer Pipeline, aber der letzte, oder wenn der Rückgabewert des Befehls invertiert wird mit !

(aus man bash )

86voto

sth Punkte 210180

Um das Skript zu beenden, sobald einer der Befehle fehlgeschlagen ist, fügen Sie dies am Anfang ein:

set -e

Dies bewirkt, dass das Skript sofort beendet wird, wenn ein Befehl, der nicht Teil eines Tests ist (wie in einem if [ ... ] Zustand oder eine && Konstrukt) wird mit einem Exit-Code ungleich Null beendet.

79voto

Mike Punkte 18362

Verwenden Sie es in Verbindung mit pipefail .

set -e
set -o pipefail

-e (errexit): Bricht das Skript beim ersten Fehler ab, wenn ein Befehl mit einem Status ungleich Null beendet wird (außer bei bis o während Schleifen, if-Tests und Listenkonstrukte)

-o pipefail: Bewirkt, dass eine Pipeline den Exit-Status des letzten Befehls in der Pipeline zurückgibt, der einen Rückgabewert ungleich Null geliefert hat.

Kapitel 33. Optionen

59voto

supercobra Punkte 14850

So wird es gemacht:

#!/bin/sh

abort()
{
    echo >&2 '
***************
*** ABORTED ***
***************
'
    echo "An error occurred. Exiting..." >&2
    exit 1
}

trap 'abort' 0

set -e

# Add your script below....
# If an error occurs, the abort() function will be called.
#----------------------------------------------------------
# ===> Your script goes here
# Done!
trap : 0

echo >&2 '
************
*** DONE *** 
************
'

31voto

Petr Peller Punkte 8358

Eine Alternative zur akzeptierten Antwort, die in die erste Zeile passt:

#!/bin/bash -e

cd some_dir  

./configure --some-flags  

make  

make install

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X