631 Stimmen

Gibt es einen TRY CATCH Befehl in Bash?

Ich schreibe ein Shell-Skript und muss überprüfen, ob eine Terminal-App installiert ist. Ich möchte einen TRY/CATCH-Befehl verwenden, um dies zu tun, es sei denn, es gibt einen eleganteren Weg.

35voto

Kostanos Punkte 8400

Es gibt so viele ähnliche Lösungen, die wahrscheinlich funktionieren. Hier ist eine einfache und funktionierende Möglichkeit, try/catch zu realisieren, mit Erklärung in den Kommentaren.

#!/bin/bash

function a() {
  # hier etwas machen
}
function b() {
  # hier mehr machen
}

# dieser Unterprozess ist ein Bereich für try
# try
(
  # dieser Flag bewirkt, dass bei einem Fehler der aktuelle Unterprozess
  # verlassen wird (alle Funktionen, die darin ausgeführt werden, werden auch bei einem Fehler abgebrochen)
  set -e
  a
  b
  # hier mehr machen
)
# und hier fangen wir Fehler ab
# catch
errorCode=$?
if [ $errorCode -ne 0 ]; then
  echo "Wir haben einen Fehler"
  # Wir beenden das gesamte Skript mit dem gleichen Fehler, wenn Sie es nicht möchten
  # beenden und weitermachen, löschen Sie einfach diese Zeile.
  exit $errorCode
fi

16voto

Dan Fabulich Punkte 34037

Wie jeder sagt, bash hat keine ordnungsgemäß unterstützte try/catch-Syntax. Sie können bash mit dem Argument -e starten oder set -e innerhalb des Skripts verwenden, um den gesamten bash-Prozess abzubrechen, wenn ein Befehl einen Exit-Code ungleich null hat. (Sie können auch set +e verwenden, um vorübergehend fehlschlagende Befehle zuzulassen.)

Also ist eine Technik, um einen try/catch-Block zu simulieren, den Start eines Unterprozesses, der die Arbeit mit -e aktiviert, durchzuführen. Dann überprüfen Sie im Hauptprozess den Rückgabecode des Unterprozesses.

Bash unterstützt Heredoc-Zeichenfolgen, sodass Sie nicht zwei separate Dateien schreiben müssen, um dies zu handhaben. Im folgenden Beispiel wird das TRY-Heredoc in einer separaten bash-Instanz mit aktiviertem -e ausgeführt. Daher stürzt der Unterprozess ab, wenn ein Befehl einen Exit-Code ungleich null zurückgibt. Dann können wir im Hauptprozess den Rückgabecode überprüfen, um einen catch-Block zu behandeln.

#!/bin/bash

set +e
bash -e <

`

Es ist kein ordnungsgemäß unterstützter try/catch-Block, aber er kann Ihnen vielleicht ähnlich weiterhelfen.

`

10voto

Davidson Lima Punkte 678

Sie können:

#!/bin/bash
if  ; then # VERSUCH

else # AUSNAHME
    echo 'Ausnahme'

fi

9voto

Sean Mayo Punkte 91

Ich benutze etwas wie dies:

DEIN BEFEHL HIER
EXITCODE=$?
if [ "$EXITCODE" -ne "0" ]; then
    #das ist der Auffangteil
    echo "oh oh"
    exit $EXITCODE
fi

dies überprüft nur den Exit-Code des Befehls und vergleicht ihn mit null (was bedeutet, dass der Befehl erfolgreich ausgeführt wurde)

6voto

Eran Ben-Natan Punkte 2475

Und du hast Fallen http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_12_02.html, die nicht dasselbe sind, aber eine andere Technik, die du für diesen Zweck verwenden kannst

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X