2012-05-24 4 views
16

Ich verwende set -e, um die Ausführung eines Skripts beim ersten Fehler zu stoppen.Wie zeige ich den letzten Befehl an, der bei Verwendung der Bash-Einstellung -e fehlgeschlagen ist?

Das Problem ist, dass dies mir nicht sagt, was schief gelaufen ist.

Wie kann ich ein Bash-Skript aktualisieren, so dass es mir den letzten fehlgeschlagenen Befehl anzeigt?

+2

Verwenden Sie nicht set -e, verwenden Sie Ihre eigenen Fehlerüberprüfung. – jordanm

+2

Ich stimme Jordan zu. Weitere Informationen finden Sie in [BashFAQ/105] (http://mywiki.wooledge.org/BashFAQ/105). –

Antwort

17

Statt set -e, einen ERR-Fall verwenden; Sie können $BASH_LINENO eingeben, um die spezifische Zeilennummer zu erhalten, auf der der Fehler aufgetreten ist. Ich biete ein Skript diesen Vorteil bei https://stackoverflow.com/a/185900/14122 in meiner Antwort unter

Fassen wir zusammen:

error() { 
    local sourcefile=$1 
    local lineno=$2 
    # ...logic for reporting an error at line $lineno 
    # of file $sourcefile goes here... 
} 
trap 'error "${BASH_SOURCE}" "${LINENO}"' ERR 
+2

Sie können auch 'set -e' und den ERR-Trap zusammen verwenden, wenn Sie möchten, dass Ihr Skript nach dem Aufruf der Trap-Funktion beendet wird, oder Sie exit explizit in der Trap-Funktion aufrufen können, wenn dies geschehen soll. –

+1

eine Idee, wie man mit ungebundenen Variablen umgehen kann set -u; echo $ str'? –

+0

Funktioniert gut in unserer Arbeit bash Bibliothek! Nicht mehr graben, um zu sehen, welcher Befehl fehlgeschlagen ist. –

1

Haben Sie versucht mit --verbose?

bash --verbose script.sh 
0

Sie können nicht set -e selbst verwenden, da die Verarbeitung unmittelbar nach jedem Fehler stoppen. Werfen Sie einen Blick auf die Set Builtin section des Bash Reference Manual für weitere Informationen über die Optionen -x und -v, die Sie zum Debuggen verwenden können.

Etwas wie:

set -e 
set -v 

bei jedem Fehler verlassen wird, während Sie auf jede Eingabezeile zeigt, wie sie gelesen wird. Es wird Ihnen jedoch nicht nur die Zeile mit dem Fehler angezeigt. Dafür müssen Sie Ihre eigene explizite Fehlerprüfung durchführen.

Zum Beispiel:

set +e 
if false; then 
    real_exit_status=$? 
    echo 'Some useful error message.' >&2 
    exit $real_exit_status 
fi 
0

set -ex zeigen (alle) Linien, wie sie auf den ersten Befehl der Rückkehr von Null verschiedenen (nicht als Teil ausgeführt und stoppen von if/while/until Konstrukten).

0
  1. make err.sh

    set -e 
    trap 'echo "ERROR: $BASH_SOURCE:$LINENO $BASH_COMMAND" >&2' ERR 
    
  2. sind es (. err.sh) in allen Skripten.

  3. ersetzen jeden

    ... | while read X ; do ... ; done

    mit

    while read X ; do ... ; done < <(...)

    in Ihren Skripten für die Falle des richtigen Zeilennummer/Befehl in der Fehlermeldung geben

Verwandte Themen