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.
Antworten
Zu viele Anzeigen?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
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.
`
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