Wie kann man eine Bash-Funktion unabhängig von der Logikprüfung behaupten?

Wie kann man eine Bash-Funktion unabhängig von der Logikprüfung behaupten?

Ich möchte für mein Bash-Skript eine globale Falle implementieren, die ausgelöst wird, wenn etwas fehlschlägt. Das Problem ist, dass die Falle nicht aufgerufen wird, wenn ich eine if-Klausel habe, die eine Funktion auswertet, die ein Prädikat ist, und während der Auswertung dieses Prädikats ein Fehler auftritt. Ich verstehe, dass Fallen nicht aufgerufen werden, wenn ein Prädikat „false“ zurückgibt, aber ich habe nicht erwartet, dass die Logik, die das Prädikat berechnet, die Falle ebenfalls deaktiviert. Ist meine Interpretation des Verhaltens richtig und gibt es eine Möglichkeit, Bash dazu zu bringen, eine Falle für die Logik aufzurufen, die ein Prädikat berechnet?

Zum Beispiel,

$ trap 'echo $?' ERR
$ set -eE
$ foo() { return 1; }
$ bar() { foo; return 0; }
$ bar
1

So weit, so gut. Ich definiere eine Falle, stelle fest, dass jeder Fehler die Falle auslöst, und stelle fest, dass alle Funktionen die Falle erben. Dann rufe ich auf, barwas aufruft foo, was fehlschlägt, die Falle auslöst und den Fehlercode ausgibt 1.

$ if bar; then echo true; fi
true

Das ist unerwartet. Ich habe erwartet, dass die Ausgabe lautet 1. Ich habe erwartet, dass nur der Rückgabecode von barnicht berücksichtigt wird. Was tatsächlich passiert, denke ich, ist, dass die gesamte Logik innerhalb von barlautetAuchvon der Betrachtung ausgeschlossen. Ist das einfach die Art und Weise, wie Bash funktioniert? Gibt es eine Möglichkeit anzugeben, dass jede Logik, bardie fehlschlägt (z. B. der Aufruf von foo), vor der letzten Anweisung (z. B. der return 0;) die Falle auslösen soll?

verwandte Informationen