Nehmen Sie Ihr Wort " Jeder Befehl hängt von jedem vorherigen Befehl ab. Wenn ein Befehl fehlschlägt, sollte das gesamte Skript fehlschlagen ", denke ich, dass Sie keine spezielle Funktion benötigen, um die Fehler zu behandeln.
Alles, was Sie brauchen, ist, Ihre Befehle mit &&
Operator und ||
Operator zu verketten, die genau das tun, was Sie geschrieben haben.
Zum Beispiel wird diese Kette unterbrochen und es wird "etwas ist schief gelaufen" ausgegeben, wenn einer der vorherigen Befehle unterbrochen wurde (Bash liest von links nach rechts).
cd foo && rm a && cd bar && rm b || echo "something went wrong"
Echtes Beispiel (ich habe dir foo, Datei a, dir bar und Datei b nur für eine echte Demo erstellt):
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm bb || echo "something is wrong"
rm: cannot remove 'bb': No such file or directory
something is wrong #mind the error in the last command
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm aa && cd bar && rm b || echo "something is wrong"
rm: cannot remove 'aa': No such file or directory
something is wrong #mind the error in second command in the row
Und schließlich, wenn alle Befehle erfolgreich ausgeführt wurden (Exit-Code 0), geht das Skript einfach weiter:
gv@debian:/home/gv/Desktop/PythonTests$ cd foo && rm a && cd bar && rm b || echo "something is wrong"
gv@debian:/home/gv/Desktop/PythonTests/foo/bar$
# mind that the error message is not printed since all commands were successful.
Es ist wichtig, sich daran zu erinnern, dass bei Verwendung von && der nächste Befehl ausgeführt wird, wenn der vorherige Befehl mit dem Code 0 beendet wurde, was für bash Erfolg bedeutet.
Wenn ein Befehl in der Kette schief geht, folgt der Befehl / script / was auch immer || wird durchgeführt.
Und nur zur Veranschaulichung: Wenn Sie abhängig von dem Befehl, der fehlerhaft ausgeführt wurde, unterschiedliche Aktionen ausführen müssen, können Sie dies auch mit einem klassischen Skript tun, indem Sie überwachen, dessen Wert $?
den Exit-Code des genau vorherigen Befehls meldet (gibt Null zurück, wenn der Befehl erfolgreich ausgeführt wurde oder eine andere positive Zahl, wenn der Befehl fehlgeschlagen ist)
Beispiel:
for comm in {"cd foo","rm a","cd bbar","rm b"};do #mind the error in third command
eval $comm
if [[ $? -ne 0 ]];then
echo "something is wrong in command $comm"
break
else
echo "command $comm executed succesful"
fi
done
Ausgabe:
command cd foo executed succesfull
command rm a executed succesfull
bash: cd: bbar: No such file or directory
something is wrong in command cd bbar
Tipp: Sie können die Meldung "bash: cd: bbar: Keine solche Datei ..." durch Anwenden unterdrücken eval $comm 2>/dev/null