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.

4voto

Aleks Punkte 669

Um Sean Mayos Antwort anzuschließen, kannst du Folgendes tun

function check {
EXITCODE=$?
if [ "$EXITCODE" -ne "0" ]; then
    #das ist der Auffangteil
    echo "uh oh"
    exit $EXITCODE
fi
}

DEIN BEFEHL HIER
check
DEIN BEFEHL HIER
check
DEIN BEFEHL HIER
check
DEIN BEFEHL HIER
check

Es funktioniert gut

3voto

joel Punkte 66

Angenommen, die Terminal-App, um die es geht, heißt 'app' (und Sie erwarten, dass sie in Ihrem $PATH ist):

if [[ ! `which app` ]]; then
    # Code ausführen, wenn die App nicht installiert ist
else
    # Code ausführen, wenn die App installiert ist
fi

2voto

Axel Heider Punkte 496

Ich kann dies im "bash -ue" Modus empfehlen:

set -ue

false && RET=$? || RET=$? 
echo "erwarte 1, erhalten ${RET}"
true && RET=$? || RET=$? 
echo "erwarte 0, erhalten ${RET}"

echo "Test try...catch"
false && RET=$? || RET=$? 
if [ ${RET} -ne 0 ]; then
  echo "Fehler ${RET} abgefangen"
fi

echo "Vorsicht, Benutzung von '||' vor '&&' scheitert"
echo "  -> Eselsbrücke: [U]nd vor [O]der im Alphabet"
false || RET=$? && RET=$? 
echo "erwarte 1, erhalten ${RET}"
true || RET=$? && RET=$? 
echo "erwarte 0, erhalten ${RET}"

1voto

syberghost Punkte 309

Eine sehr einfache Sache, die ich benutze:

try() {
    "$@" || (e=$?; echo "$@" > /dev/stderr; exit $e)
}

0voto

openCivilisation Punkte 582

Ich bevorzuge die Verwendung von Trap, um dieses Problem zu lösen, da es am wenigsten mit der Formatierung interferiert.

Ich kopiere ein Beispiel für die Verwendung von Trap aus dieser großartigen Lektüre von Dirk Avery: https://medium.com/@dirk.avery/the-bash-trap-trap-ce6083f36700

#!/bin/bash
set -e
trap 'catch $? $LINENO' EXIT
catch() {
  echo "fangen!"
  if [ "$1" != "0" ]; then
    # Fehlerbehandlung hier
    echo "Fehler $1 ist auf $2 aufgetreten"
  fi
}
simple() {
  badcommand
  echo "Hallo von simple()!"
}
simple
echo "Nach dem Aufruf von simple"

Das würde die folgende Ausgabe erzeugen:

./script.sh: Zeile 13: badcommand: Befehl nicht gefunden
fangen!
Fehler 127 ist auf 12 aufgetreten

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