Ein üblicher Weg ist:
die() {
IFS=' ' # make sure "$*" is joined with spaces
# output the arguments if any on stderr:
[ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
exit 1
}
dann benutzt du es so:
mkdir -p some/path || die "mkdir failed with status $?"
Wenn Sie möchten, dass der Exit-Status angezeigt wird, können Sie ihn in Folgendes ändern:
die() {
last_exit_status=$?
IFS=' '
printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
exit 1
}
und dann ist es ein bisschen einfacher:
mkdir -p some/path || die "mkdir failed"
Wenn dies fehlschlägt, wurde mkdir
wahrscheinlich bereits eine Fehlermeldung ausgegeben, sodass die zweite möglicherweise als redundant angesehen wird, und Sie können einfach Folgendes tun:
mkdir -p some/path || exit # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always
(oder verwenden Sie die erste Variante von die
oben ohne Argument)
Nur für den Fall, dass Sie es noch nicht gesehen command1 || command2
haben, wird es ausgeführt command1
, und wenn es command1
fehlschlägt, wird es ausgeführt command2
.
Sie können es also wie "Make the Directory or Die" lesen.
Ihr Beispiel würde folgendermaßen aussehen:
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Oder Sie können die dies
weiter rechts ausrichten , damit der Hauptcode offensichtlicher wird.
mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"
Oder in der folgenden Zeile, wenn die Befehlszeilen lang sind:
mkdir -p some/path ||
die "mkdir failed"
cd some/path ||
die "cd failed"
some_command ||
die "some_command failed"
Wenn Sie den Namen some/path
mehrmals verwenden möchten, speichern Sie ihn in einer Variablen, damit Sie ihn nicht weiter eingeben müssen, und können ihn bei Bedarf problemlos ändern. Wenn Sie variable Argumente an Befehle übergeben, stellen Sie sicher, dass Sie das --
Optionsbegrenzer verwenden, damit das Argument nicht als Option verwendet wird, wenn es mit beginnt -
.
dir=some/path
mkdir -p -- "$dir" || die "Cannot make $dir"
cd -P -- "$dir" || die "Cannot cd to $dir"
some_command || die "Cannot run some_command"
return $?
die integrierte:
ersetzen.Wenn Sie wirklich
exit
einen Fehler melden möchten und Bash verwenden, sollten Sie dies ebenfalls berücksichtigenset -e
. Vonhelp set
:Dies gibt Ihnen natürlich nicht die Flexibilität einer did_it_work () -Funktion, aber es ist eine einfache Möglichkeit, sicherzustellen, dass Ihr Bash-Skript bei einem Fehler stoppt, ohne Ihrer neuen Funktion viele Aufrufe hinzuzufügen.
quelle
set -e
ist nützlich. Es gibt einige Befehle, die unter normalen Umständen ungleich Null zurückgeben (z. B.diff
). Wenn ich set -e in einem Skript verwende, in dem ich eine Rückkehr ungleich Null erwarte, tue ich dascommand || true
.set -e
einen „Ausnahmebehandler“ festlegen, mit dem alle Fehler abgefangen werdentrap did_it_work EXIT
.command && true
. Auf diese Weise wird der Rückgabewert nicht geändert.command || true
besteht darin, dasset -e
Beenden des Skripts zu verhindern, wenncommand
ein Exit-Code ungleich Null zurückgegeben wird. Es ändert den Exit-Code, weil wir müssen. Das einzige, was Sie tuncommand && true
müssen, ist auszuführentrue
(einen Null-Exit-Code zurückgeben), wenn der Befehl `erfolgreich war (einen Null-Exit-Code zurückgegeben) - es ist ein vollständiges No-Op.