Ich verwende folgende Optionen
set -o pipefail
set -e
Im Bash-Skript, um die Ausführung bei einem Fehler zu stoppen. Ich habe ~ 100 Zeilen Skript ausgeführt und möchte nicht den Rückkehrcode jeder Zeile im Skript überprüfen.
Aber für einen bestimmten Befehl möchte ich den Fehler ignorieren. Wie kann ich das machen?
-e
Attribut festgelegt wird, "wenn der fehlgeschlagene Befehl Teil der Befehlsliste ist, die unmittelbar auf ein Schlüsselwortwhile
oder folgtuntil
, Teil des Tests in einerif
Anweisung, Teil eines ausgeführten Befehls in einer&&
oder||
Liste mit Ausnahme des Befehls nach dem letzten&&
oder einem||
beliebigen Befehl in einer Pipeline außer dem letzten oder wenn der Rückgabestatus des Befehls mit invertiert wird!
. "(ldd $2/bin/* || true) | grep "not found" | wc -l
script wird nach dieser Zeile beendet, wenn ldd return fehlschlägt(ldd $2/bin/* || true) | grep "not found" | wc -l || true
set -o pipefail
. Wenngrep
nichts gefunden wird, wird ein Exit-Code ungleich Null zurückgegeben, und die Shell kann davon ausgehen, dass die gesamte Pipe einen Exit-Code ungleich Null hat.Fügen
|| true
Sie einfach nach dem Befehl hinzu, wo Sie den Fehler ignorieren möchten.quelle
set -e
versuchen, eine Fehlermeldung zu erfassen: z. B.set -e; TEST=$(foo 2>&1 || true); echo $TEST
Halten Sie nicht an und speichern Sie auch den Exit-Status
Nur für den Fall, dass Ihr Skript nicht angehalten werden soll, wenn ein bestimmter Befehl fehlschlägt, und Sie auch den Fehlercode des fehlgeschlagenen Befehls speichern möchten:
quelle
command
erfolgreich und es muss ausgeführt werden, was danach ist||
. Lesen Sie es wiecommand
folgt : Wenn dies fehlschlägt, tun Sie esEXIT_CODE=$?
. Sie könnten wahrscheinlich einfachcommand || echo "$?"
"trap" für ein ausführlicheres Debugging verwenden. Siehe dies -> stackoverflow.com/a/6110446/10737630Genauer gesagt:
Aus der POSIX-Spezifikation bezüglich
set -e
(Schwerpunkt Mine):quelle
-e
.!
Wille verhindert, dass die Shell auf jeden Fall austritt. Dieses Skript zeigt die Meldung an,Still alive!
wenn ich es ausführe, und zeigt an, dass das Skript vollständig ausgeführt wurde. Sehen Sie ein anderes Verhalten?if
Klausel gesetzt und das Problem gelöst.Anstatt "true zurückzugeben", können Sie auch das Dienstprogramm "noop" oder null (wie in den POSIX-Spezifikationen angegeben ) verwenden
:
und einfach "nichts tun". Sie werden ein paar Briefe speichern. :) :)quelle
Wenn Sie verhindern möchten, dass Ihr Skript fehlschlägt, und den Rückkehrcode erfassen:
returncode
wird unabhängig davon gesammelt, ob der Befehl erfolgreich ist oder fehlschlägt.quelle
Ich habe das folgende Snippet bei der Arbeit mit CLI-Tools verwendet und möchte wissen, ob eine Ressource vorhanden ist oder nicht, aber die Ausgabe ist mir egal.
quelle
if [ -r not_exist ]
Diese Lösung gefällt mir irgendwie:
Der Befehl / das Skript zwischen den Back-Ticks wird ausgeführt und seine Ausgabe wird dem Befehl ":" zugeführt (was "true" entspricht).
edit: Hässlicher Tippfehler behoben
quelle
während
|| true
ist bevorzugt, aber Sie können auch tunquelle
Von hier aus haben keine Lösungen für mich funktioniert, daher habe ich eine andere gefunden:
Dies ist nützlich für CI & CD. Auf diese Weise werden die Fehlermeldungen gedruckt, aber das gesamte Skript wird weiterhin ausgeführt.
quelle
Beispiel für die Verwendung zum Erstellen einer Protokolldatei
quelle
Vielen Dank für die einfache Lösung hier von oben:
Die folgende Konstruktion kann für zusätzliche Aktionen / Fehlerbehebung bei Skriptschritten und zusätzliche Optionen zur Flusssteuerung verwendet werden:
Wir können die weiteren Maßnahmen und
exit 1
bei Bedarf bremsen .quelle