2010-10-22 4 views
0

J'ai un script bash qui est un répertoire pour les téléchargements. Quand il voit un fichier xml dans le répertoire. Le script prend le fichier et appelle un programme de ligne de commande Java utilisant xslt pour transformer le fichier. Je veux mv le fichier dans un répertoire différent (erreurs) si le script ou le programme de ligne de commande java jette une erreur pendant le traitement. Puis envoyez-moi l'erreur.Actions conditionnelles basées sur une erreur dans le script shell

j'allais mettre exec 2> erreur de la déclaration de traitement "courrier -s

en haut du script pour attraper sortie pour stderr. Mais cela ne semble pas très élégant et ne déplace pas le fichier en question.

Répondre

4

Vous pouvez les conditions d'erreur de piège dans bash (toute déclaration qui retourne une condition non nul qui ne sont pas traitées en ligne):

trap func ERR 

Puis Func (fonction vous permet de définir), vous pouvez faire ce que vous besoin de nettoyer.

Par exemple:

#!/bin/bash 

function foo() { 
    echo "cleaning up" 
} 

trap foo ERR 

echo "about to execute false" 

false 

echo "exiting" 

course qui se traduira par:

./foo.sh 
about to execute false 
cleaning up 
exiting 
+0

Un piège 'ERR' ou' set -e' ne semble pas vraiment utile s'il n'y a qu'une seule commande à vérifier ;-) – jilles

3

Vous avez besoin de deux choses ici. D'abord, déterminez si le programme échoue. Ceci est généralement connu par la valeur de retour de la fonction main() du programme. Si le programme renvoie quelque chose de différent à 0, il y a une erreur. Dans tous les cas, la deuxième chose à faire est de capturer la sortie d'erreur standard dans un fichier pour l'envoyer plus tard. Donc:

if ! program inputfile 2> errorfile ; then 
    mv inputfile error_directory 
    mail -s "error" < errorfile 
fi 
rm errorfile 

Vous devez vérifier, cependant, si votre programme respecte cette convention pour signaler une erreur.

+0

'test' ne devrait pas être littéral ici. Le programme devrait être appelé directement après le mot clé '!', L'utilitaire intégré 'test' n'est pas impliqué. – jilles

+0

Oups. Tu as raison. Corrigée. Merci! –