Gibt es einen TRY CATCH-Befehl in Bash?
Ich Schreibe ein shell-Skript und brauchen, um zu überprüfen, die eine terminal-app installiert wurde. Ich möchte einen TRY/CATCH " - Befehl, um dies zu tun, es sei denn, es ist ein ordentlicher Weg.
InformationsquelleAutor der Frage Lee Probert | 2014-02-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht.
Bash nicht so viele Genussmittel wie kann man in vielen Programmiersprachen.
Gibt es keine
try/catch
in der bash, aber damit kann man erreichen, ein ähnliches Verhalten mit&&
oder||
.Mit
||
:wenn
command1
fehlschlägt, danncommand2
läuft wie folgtÄhnlich, mit
&&
command2
ausgeführt wird, wenncommand1
erfolgreich istAnnäherung
try/catch
ist wie folgtAuch die bash enthält einige error-handling-Mechanismen, sowie
Wird er sofort aufhören, Ihr Skript, wenn Sie einen einfachen Befehl zu einem Fehler. Ich denke, das sollte das Standard-Verhalten. Da solche Fehler fast immer bedeuten, etwas unerwartetes, es ist nicht wirklich 'gesund' zu halten, ausführen der folgenden Befehle.
Und auch, warum nicht
if...else
. Es ist dein bester Freund.InformationsquelleAutor der Antwort Jayesh Bhoi
Basierend auf einige Antworten, die ich hier gefunden habe, machte ich mir einen kleinen helper-Datei, Quelle für meine Projekte:
trycatch.sh
hier ist ein Beispiel, wie es aussieht, im Einsatz:
InformationsquelleAutor der Antwort Mathias Henze
Hab ich entwickelte eine fast makellose try & fangen Umsetzung in der bash, das Ihnen erlaubt, code zu schreiben, wie:
Können Sie auch verschachteln von try-catch-Blöcke im inneren selbst!
Der code ist ein Teil meiner bash boilerplate/Rahmen. Es erweitert die Idee von try & fangen Sie mit Dinge wie Fehlerbehandlung mit backtrace und Ausnahmen (plus einige andere nette features).
Hier ist der code, der verantwortlich ist, nur für try & Fang:
Fühlen Sie sich frei zu verwenden, Gabel und tragen - es ist auf GitHub.
InformationsquelleAutor der Antwort niieani
bash
nicht zum Abbruch der Laufenden Ausführung im Falle sth erkennt einen Fehler-Zustand (es sei denn, Sie legen Sie die-e
flag). Programmiersprachen bietentry/catch
dies tun, um zu hemmen ein "bailing out", weil diese spezielle situation (daher in der Regel sogenannte "Ausnahme").In der
bash
sondern nur der Befehl in Frage gestellt wird beendet mit exit-code größer als 0 ist, was angibt, dass Fehler-Zustand. Sie können überprüfen, natürlich, aber da gibt es keine automatische die Rettung von nichts, ein try/catch - nicht sinnvoll. Es fehlt nur, dass der Kontext.Allerdings können Sie simulieren eine die Rettung durch Verwendung von sub-shells, die beendet werden können und an einem Punkt Sie sich entscheiden:
Statt, die
some_condition
mit einemif
können Sie auch einfach einen Befehl auszuprobieren, und falls es fehl (hat einen exit-code größer als 0), bail out:Leider, mit dieser Technik sind Sie darauf beschränkt zu 255 unterschiedliche exit-codes (1..255) und kein vernünftiges exception-Objekte können verwendet werden.
Wenn Sie mehr Informationen benötigen, um pass zusammen mit dem simulierten Ausnahme, können Sie die stdout von der Unterschalen, aber das ist ein bisschen kompliziert und vielleicht eine andere Frage 😉
Indem Sie die oben genannten
-e
flag, um der shell kann man auch Streifen, die expliziteexit
Aussage:InformationsquelleAutor der Antwort Alfe
Wie jeder sagt, bash nicht haben, eine angemessene Sprache-unterstützt von try/catch-syntax. Starten Sie die bash mit der
-e
argument oder verwenden Sieset -e
im script zum Abbruch des gesamten bash-Prozesses, wenn ein Befehl mit einem nicht-null exit-code. (Sie können auchset +e
vorübergehend zu erlauben, andernfalls Befehle.)So, einer Technik zur Simulation eines try/catch-block zu starten, ein sub-Prozess, um die Arbeit mit
-e
aktiviert. Dann in der main-Prozess, überprüfen Sie den return-code des sub-Prozesses.Bash unterstützt heredoc-strings, so dass Sie nicht haben, um zu schreiben, zwei separate Dateien, um diese zu bewältigen. In dem unten angeführten Beispiel, die VERSUCHEN heredoc wird in ein separates bash-Instanz, mit
-e
aktiviert, so dass der sub-Prozess zum Absturz bringen, wenn jeder Befehl gibt einen nicht-null exit-code. Dann, zurück in der main-Prozess, können wir prüfen den return-code zum behandeln von einem catch-block.Es ist keine richtige Sprache-unterstützt try/catch-block, aber es kann kratzen, ein ähnliches Jucken Sie.
InformationsquelleAutor der Antwort Dan Fabulich
Können Sie
trap
:try { block A } catch { block B } finally { block C }
übersetzt:
InformationsquelleAutor der Antwort Mark K Cowan
Und Sie fallen http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html das ist nicht das gleiche, aber andere Technik, die Sie für diesen Zweck verwenden können
InformationsquelleAutor der Antwort Eran Ben-Natan
Gibt es so viele ähnliche Lösungen, die wahrscheinlich funktionieren. Unten ist eine einfache und funktionierende Art und Weise zu erreichen, try/catch, mit Erklärung in den Kommentaren.
InformationsquelleAutor der Antwort Kostanos
Können Sie tun:
InformationsquelleAutor der Antwort Davidson Lima
Eine sehr einfache Sache, die ich benutze:
InformationsquelleAutor der Antwort syberghost