Bash erfasst jeden Fehler wie -e, aber beendet ihn nicht, macht etwas anderes

8

Ich möchte ein Flag in einem Shell-Skript (Bash) setzen, so dass, wenn etwas ungleich Null ist, ein Flag gesetzt wird (dh eine Variable wie gesetzt errors="True").

Bisher habe ich darüber nachgedacht, das Skript mit aufzurufen scriptname.sh 2>Error.logund dann Folgendes zu tun:

 if $(wc -l error.log) != 0; then
   errors="True"

Es muss einen viel besseren Weg geben. Bitte erleuchte mich.

Gregg Leventhal
quelle

Antworten:

6

Genau dafür trap ERRist es da. Leider hat es die gleichen Einschränkungen und Nachteile wie set -e. Wie set -ejeder Befehl, der in einem bedingten Ausdruck einen Wert ungleich Null zurückgibt, löst er den Trap aus. Hier ist ein Beispielcode:

error=0
set_error() {
    (( error++ )) 
}

trap set_error ERR
ls askdjasdaj 2>/dev/null
false
false || true # false returns non-zero but is not counted due to the conditional
echo "$error" # outputs "2"
Jordanm
quelle
Vielen Dank! Funktioniert die Falle bei Fehlern, die unterhalb der Linie liegen, in der sich die Falle befindet? trap -l listet Standardsignale auf, ich sehe kein ERR, aber ERR scheint zu funktionieren. Was ist ERR? Ist es ein Signal oder eine Abkürzung für den Dateideskriptor?
Gregg Leventhal
@ GreggLeventhal - es ist auch nicht, es ist etwas Besonderes zu schlagen. Weitere Details finden Sie im Abschnitt "Trap" der Bash-Manpage.
Jordan
Entschuldigung, ich habe es gerade gelesen (oder angefangen, es zu lesen). Ich bin ein wenig verwirrt, weil Errtrace nicht in meiner Shell festgelegt ist. Ich dachte, ich hätte gesehen, dass es festgelegt werden muss, damit das ERR-Schlüsselwort mit Trap funktioniert, aber ich habe das möglicherweise falsch verstanden.
Gregg Leventhal