Wie bekomme ich die Effekt und usefuless von "set -e" innerhalb eines shell-Funktion?

set -e (oder ein Skript starten mit #!/bin/sh -e) ist äußerst nützlich, um automatisch die Bombe aus, wenn es ein problem gibt. Es spart mir mit zu Fehler überprüfen jeden einzelnen Befehl, der fehlschlagen könnte.

Wie komme ich an das äquivalent von diesem innerhalb einer Funktion?

Ich habe zum Beispiel das folgende Skript aus, dass die Ausgänge sofort auf Fehler mit einer error-exit-status:

#!/bin/sh -e

echo "the following command could fail:"
false
echo "this is after the command that fails"

Die Ausgabe ist wie erwartet:

the following command could fail:

Nun möchte ich zum Abschluss noch in eine Funktion:

#!/bin/sh -e

my_function() {
    echo "the following command could fail:"
    false
    echo "this is after the command that fails"
}

if ! my_function; then
    echo "dealing with the problem"
fi

echo "run this all the time regardless of the success of my_function"

Erwartete Ausgabe:

the following command could fail:
dealing with the problem
run this all the time regardless of the success of my_function

Aktuelle Ausgabe:

the following output could fail:
this is after the command that fails
run this all the time regardless of the success of my_function

(ie. die Funktion ignoriert die set -e)

Diese vermutlich zu erwartende Verhalten. Meine Frage ist: wie bekomme ich die Effekt und usefuless von set -e in einem shell-Funktion? Ich möchte in der Lage sein, etwas nach oben, so dass ich nicht haben, um individuell Fehler kontrollieren Sie jeden Anruf, aber das Skript beim auftreten eines Fehlers beendet. Es sollte entspannen Sie den Stapel so weit wie nötig, bis ich tun, überprüfen Sie das Ergebnis, oder beenden Sie das Skript selbst wenn ich noch nicht überprüft. Dies ist, was set -e schon, außer dass es keine nest.

Habe ich gefunden die gleiche Frage gebeten, außerhalb Stack-Überlauf, aber keine passende Antwort.

Diese Frage ist nicht doppelt. Ich habe diese Frage vor drei Jahren die andere Frage. Diese Frage ist speziell über einen Weg zu finden, zu erreichen, die das gleiche Verhalten wie set -e, aber innerhalb einer Funktion. Die andere Frage ist einfach, fragt etwa ähnlich überraschend Verhalten. Diese Frage hat weit mehr Stimmen, stars, Ansichten und nützliche Antworten für die verschiedenen alternativen, und ich denke, dass macht viel mehr Sinn offen zu halten, als der andere. Wenn überhaupt, dann markieren Sie das doppelte auf die andere Weise Runde.
In aller fairness aber die Antwort auf die andere Frage ist sehr auf den Punkt und beantwortet die Frage, wie gut. Ich bin nicht bewandert genug in der bash, um zu entscheiden, was gehen sollte, wo und wie, aber wenn Sie ein gold-badge-Besitzer denkt, dass Weg, würde ich geneigt sein zu Folgen, die dupe Stimme.
Ich habe nichts gegen die andere Frage. Das Frage, jedoch ist hier für Entwickler, die zur Lösung der spezifischen Frage, die ich fragte. Es ist klar, dass es keine gute Antwort, aber alle Antworten hier etwas nützliches. Ich glaube nicht, dass es angemessen halten, diese Frage geschlossen, um neue Antworten, die vielleicht ebenso nützlich. Bietet, eine Antwort in der anderen Frage stattdessen verstecken Sie es wie die Frage fragt die eine subtil andere Frage ("Warum tut er das?" anstatt "Wie kann ich das erreichen?").
Ich habe bearbeitet den Titel (jetzt von der ursprünglichen Frage Körper), um zu versuchen, um dieses klarer.
Was ist falsch mit der Einstellung ein Fehler Falle, als pro das doppelte?

InformationsquelleAutor Robie Basak | 2010-11-01

Schreibe einen Kommentar