87 votes

La gestion des exceptions dans les scripts shell?

Je suis à la recherche pour la gestion des exceptions mécanisme dans un script shell. Est-il un try,catch équivalent mécanisme en script shell ?

138voto

MatToufoutu Points 5879

Il n'est pas vraiment un try/catch en bash (je suppose que vous utilisez bash), mais vous pouvez obtenir un tout à fait le même comportement à l'aide de && ou ||.

Dans cet exemple, vous souhaitez exécuter fallback_command si a_command d'échec (retourne une valeur non nulle):

a_command || fallback_command

Et dans cet exemple, vous voulez exécuter second_command si a_command est réussie (retourne 0):

a_command && second_command

Ils peuvent facilement être mélangés à l'aide d'un shell interne est exécuté, par exemple, la commande suivante va exécuter a_command, si elle réussit, elle sera alors exécuté other_command, mais si l' a_command ou other_command d'échec, fallback_command seront exécutées:

(a_command && other_command) || fallback_command

13voto

brightlancer Points 939

Le si/d'autre de la structure et les codes de sortie peut vous aider à faux certaines d'entre elles. Cela devrait fonctionner dans Bash ou Bourne (sh).

if foo ; then
else
  e=$?        # return code from if
  if [ "${e}" -eq "1"]; then
    echo "Foo returned exit code 1"
  elif [ "${e}" -gt "1"]; then
    echo "Foo returned BAD exit code ${e}"
  fi
fi

3voto

Voici deux simples bashfunctions qui permettent eventhandling dans bash:

Vous pouvez l'utiliser pour la base de exceptionhandling comme ceci:

onFoo(){
  echo "onFoo() called width arg $1!"
}  

foo(){
  [[ -f /tmp/somefile ]] || throw EXCEPTION_FOO_OCCURED "some arg"
} 

addListener EXCEPTION_FOO_OCCURED onFoo

Exceptionhandling à l'aide de blocs try/catch n'est pas pris en charge dans bash, cependant, vous pourriez veux essayer de regarder les BANGSH cadre qui le supporte (c'est un peu comme jquery pour bash).

Cependant, exceptionhandling sans en cascade try/catch-blocs est similaire à eventhandling, ce qui est possible dans presque toutes les langues avec la matrice de support.

Si vous souhaitez conserver votre code de nice et bien rangé (sans if/else verbosité), je vous recommande d'utiliser les événements.

La suggestion, qui MatToufoutu recommande (à l'aide de || et &&) n'est pas recommandé pour les fonctions, mais ok pour les commandes simples. (voir BashPitfalls sur les risques)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X