Angenommen, ein Shell-Skript (/ bin/sh oder/bin/bash) enthielt mehrere Befehle. Wie kann ich das Skript sauber beenden, wenn einer der Befehle einen fehlgeschlagenen Beendigungsstatus hat? Natürlich kann man Blöcke und/oder Rückrufe verwenden, aber gibt es eine sauberere, prägnantere Art und Weise? Die Verwendung von & & ist auch nicht wirklich eine Option, weil die Befehle lang sein können, oder das Skript könnte nicht-triviale Dinge wie Schleifen und Bedingungen haben.Shell Scripting: sterben auf jeden Fehler
Antwort
Mit Standard sh
und bash
können Sie
set -e
Es wird
$ help set
...
-e Exit immediately if a command exits with a non-zero status.
Es funktioniert auch (von dem, was ich sammeln konnte) mit zsh
. Es sollte auch für alle Bourne Shell-Nachkommen funktionieren.
Mit csh
/tcsh
, haben Sie Ihr Skript starten mit #!/bin/csh -e
werden können, die Sie verwenden können:
$ <any_command> || exit 1
Dieses Muster ist nützlich für ** selektiv beenden bei Ausfall einzelner Befehle ** und auch **, wenn Sie zuerst eine benutzerdefinierte Fehlermeldung ** drucken möchten. Um letzteres zu tun, verwenden Sie etwas wie '
Live und lernen: Bash verfügt über eine Befehlsgruppierung, so dass der von mir erwähnte 'eval'-Trick nicht benötigt wird. Verwenden Sie stattdessen '
Sie können $ überprüfen? zu sehen, was der jüngste Exit-Code ist ..
beispiel
#!/bin/sh
# A Tidier approach
check_errs()
{
# Function. Parameter 1 is the return code
# Para. 2 is text to display on failure.
if [ "${1}" -ne "0" ]; then
echo "ERROR # ${1} : ${2}"
# as a bonus, make our script exit with the right error code.
exit ${1}
fi
}
### main script starts here ###
grep "^${1}:" /etc/passwd > /dev/null 2>&1
check_errs $? "User ${1} not found in /etc/passwd"
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1`
check_errs $? "Cut returned an error"
echo "USERNAME: $USERNAME"
check_errs $? "echo returned an error - very strange!"
-1: Dies ist ein allzu häufiges Antipattern. @ Barun Lösung ist einfacher und idiomatischer. – tripleee
das gleiche Skript wie oben, aber als ein sauberer "aufgeräumter Ansatz" (alle in einer Zeile): foo = $ (grep "^ $ {1}"/etc/passwd) && foo = $ (echo "$ foo" | cut -d: -f1) && echo ok || echo not_ok (NB: wenn bash verwendet wird, und nicht beschränkt auf sh, kann man den Exit-Status eines beliebigen Teils einer Pipeline erhalten, was die grep/cut-Logik vereinfacht.) – michael
verwenden Sie einfach -e – Codefor
- 1. Shell Scripting mit Node.js
- 2. awk, Shell Scripting
- 3. shell scripting Mehrere Generatoren
- 4. Awk shell scripting
- 5. Boolesch in Shell Scripting
- 6. Shell Scripting | tr -d '\ [\] \ _'
- 7. Shell-Scripting-Überprüfung Python-Version
- 8. ganzzahliger Ausdruck erwartet - shell scripting
- 9. Shell Scripting Wenn [-f ./file]
- 10. Linux Shell Scripting - Argumente prüfen
- 11. Shell Scripting - Rohrleitungen und Umleitung
- 12. Shell Scripting Parameter $ {1,} _ Name
- 13. PHP: Muss sterben() sterben?
- 14. Bash Scripting, auf Fehler prüfen, Protokollierung
- 15. Lese: Illegale Option es in Shell-Scripting
- 16. Shell Scripting: Verwenden von Bash mit Xargs
- 17. shell/batch scripting, um Befehle an adb shell zu leiten
- 18. Verwendung von \ c in Shell-Scripting
- 19. Understanding mkfifo PIPE Verwendung in Shell Scripting
- 20. Wie mache ich das durch Shell Scripting?
- 21. Bash Shell Scripting - Return-Taste/Enter-Taste
- 22. ein Skript von stdin (Linux/Shell Scripting)
- 23. Unix-Shell-scripting - mehrere Datei concatenate
- 24. Datum -d Option Verwendung in Shell Scripting
- 25. Git Run Shell-Befehl für jeden Commit
- 26. Bash Shell Scripting: Was für eine einfache Logik fehlt mir
- 27. Nicht möglich, zwei Variablen in Shell-Scripting zu subtrahieren
- 28. shell-scripting: Verwenden Sie eine Pipe als Eingabe für tar
- 29. Shell Scripting - Ist es möglich, .sh-Datei im Hintergrund auszuführen
- 30. AsyncTask-Threads nie sterben
Danke, das zu sein, was scheint, ich will. Ich sollte meine Google Fu schärfen, ich denke ... :) – Pistos
Beachten Sie, dass Befehle in Conditionals fehlschlagen können, ohne das Skript zu beenden - was entscheidend ist. Zum Beispiel: wenn grep etwas/etwas/wo; dann: es wurde gefunden; sonst: es wurde nicht gefunden; Es funktioniert gut, egal ob etwas in/etwas/wo gefunden wird. –
Sie sagen "Standard-sh". Bedeutet das, dass es POSIX ist? Edit: Ich habe es nachgeschlagen und es ist POSIX: http://pubs.opengroup.org/onlinepubs/009695399/utilities/set.html – Taywee