Also habe ich ein kleines Skript zum Ausführen einiger Tests.
javac *.java && java -ea Test
rm -f *.class
Das Problem dabei ist, dass beim Ausführen des Skripts ./test
ein erfolgreicher Beendigungscode zurückgegeben wird, selbst wenn der Test fehlschlägt, weil er rm -f *.class
erfolgreich ist.
Die einzige Möglichkeit, die ich mir vorstellen könnte, es dazu zu bringen, das zu tun, was ich will, ist für mich hässlich:
javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Dies scheint jedoch ein häufiges Problem zu sein: Führen Sie eine Aufgabe aus, bereinigen Sie sie und geben Sie den Beendigungscode der ursprünglichen Aufgabe zurück.
Was ist die idiomatischste Art, dies zu tun (in Bash oder nur Muscheln im Allgemeinen)?
quelle
eval
ist immer ein Fanfavorit.Ich würde gehen mit:
Warum herumspringen, wenn
exit
verfügbar?Sie könnten eine verwenden
trap
:Beispielsweise:
quelle
exit ${last_error_code:=0}
.Soweit ich weiß, ist das, was bash einem
try...finally
Block aus einer C-ähnlichen Programmiersprache am nächsten kommt (was Sie wahrscheinlich wünschen würden, wenn es verfügbar wäre), dastrap
Konstruktion, die wie funktioniert:Dies führt "rm -f * .class" aus, wenn Ihr Skript beendet wird. Wenn Sie etwas komplexeres zu tun haben, können Sie es in eine Funktion einfügen:
Wenn Sie so geneigt sind, können Sie dies in eine ziemlich allgemeine Redewendung umwandeln, die ungefähr wie ein
try...catch...finally
Block in C funktioniert.Beachten Sie, dass die Klammern eine Unterschale begrenzen. Bei dieser Konstruktion wird nur die Subshell beendet, wenn ein Befehl fehlschlägt, nicht das gesamte Skript. Denken Sie daran, dass Subshells etwas rechenintensiv sind. Verwenden Sie daher nicht zu viele (Hunderte) davon. Abhängig von Ihrem Skript sind Sie möglicherweise in der Lage, denselben Effekt mit Shell-Funktionen und effizienter zu erzielen
trap ... RETURN
, aber das liegt an Ihnen.quelle