Wie führe ich einen Befehl aus und führe, wenn dieser fehlschlägt, einen anderen Befehl aus und gebe 1 zurück?

Wie führe ich einen Befehl aus und führe, wenn dieser fehlschlägt, einen anderen Befehl aus und gebe 1 zurück?

Ich bin diesen Stil aus anderen Sprachen gewohnt:

do_something || (log_error; return 1) # do something, and if that fails, log the error and then return 1 no matter what, even if the logging fails.

Aber ich kann in Bash kein Äquivalent finden. Das Problem ist, dass die Klammern wie eine Funktion mit eigenem Gültigkeitsbereich funktionieren und die Rückgabe 1 nicht das erwartete Verhalten aufweist.

Das ist, was ich bisher habe, aber es ist nicht perfekt:

! do_something && log_error && return 1

Das Problem dabei ist, dass das ! verwirrend ist und die Rückgabe von 1 vom Erfolg der Protokollierung abhängt.

Das hier ist besser, aber ausführlicher:

do_something || (log_error; return 1) || return 1

Irgendwelche Gedanken?

Antwort1

Verwenden Sie Klammern.

 do_something || { log_error; return 1;}

Antwort2

Der Beendigungsstatus des zuletzt ausgeführten Befehls wird in der $?Variable gespeichert. Sie könnten also etwa Folgendes tun:

do something
if [[ $? > 0 ]]; then 
   do log_error; exit 1; 
fi

Das gefällt mir aus Gründen der Lesbarkeit. Ihr Beispiel ist jedoch vollkommen in Ordnung, Sie müssen es nur &&durch Folgendes ersetzen ;:

! do_something && log_error ; return 1

&&bedeutet „führe den nächsten Befehl NUR aus, WENN der vorherige erfolgreich beendet wurde“, während ;nur „führe den nächsten Befehl aus“ bedeutet.

verwandte Informationen