2010-01-12 18 views
2

J'ai un programme (grabface) qui prend une photo du visage d'une personne à l'aide d'une webcam, et j'ai aussi une enveloppe de script shell qui fonctionne comme ceci:exécuter automatiquement un programme si un autre programme renvoie une erreur

Sur la ligne de commande, l'utilisateur donne au script le nom d'un programme à exécuter et ses arguments de ligne de commande. Le script exécute ensuite la commande donnée et vérifie le code de sortie. S'il y avait une erreur le programme grabface est exécuté pour capturer le visage surpris de l'utilisateur.

Tout cela fonctionne très bien. Mais le problème est que le script wrapper doit toujours être utilisé. Est-il possible d'exécuter automatiquement ce script chaque fois qu'une commande est entrée dans le shell? Ou existe-t-il un autre moyen d'exécuter automatiquement un programme donné après l'exécution d'un programme?

De préférence, la solution devrait fonctionner dans bash, mais toute autre coque est également OK. Je réalise que cela pourrait être accompli en faisant simplement quelques ajustements dans le code source du shell, mais c'est une sorte de dernière mesure. Une chose qui est probablement encore plus délicate serait d'étendre ceci pour travailler avec des programmes lancés à l'extérieur du shell (par exemple à partir d'un environnement de bureau) mais cela peut être trop difficile.

Édition: Awsome! Depuis bash était si facile, qu'en est-il des autres coquilles?

Répondre

4

Dans Bash, vous pouvez utiliser trap command avec un argument de ERR pour exécuter une commande spécifiée lorsqu'une commande exécutée renvoie une valeur non nulle.

 
$ trap "echo 'there was an error'" ERR 
$ touch ./can_touch 
$ touch ./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa 
touch: cannot touch `./asfdsafds/fdsafsdaf/fdsafdsa/fdsafdasfdsa/fdsa': No such file or directory 
there was an error 

trap affecte toute la session, vous devrez donc vous assurer que trap est appelé au début de la session en mettant en .bashrc ou .profile.

1

Dans le .profile de l'utilisateur ajouter:

trap grabface ERR 
2

Autres trap spéciaux signaux Bash COMPREND sont: DEBUG, RETOUR et EXIT ainsi que tous les signaux du système (qui peuvent être indiquées à l'aide trap -l).

Le shell Korn dispose d'une fonctionnalité similaire, tandis que le shell Z possède une capacité de trappe plus étendue. Par ailleurs, dans certains cas pour la ligne de commande, il peut être utile dans Bash de définir la variable PROMPT_COMMAND sur un script ou une commande qui sera exécutée chaque fois que l'invite est émise.

2

Juste substituer votre commande où j'ai le faux.
false || echo "It failed"

Si vous voulez faire la oposite, comme quand il réussit, il suffit de mettre votre commande au lieu de vrai:
true && echo "It succeeded"

+0

Bien sûr, mais cela ne répond pas vraiment à la question. Comme je l'ai déjà dit, j'ai un script wrapper qui fait cela. Ce que je voulais savoir, c'est comment je pourrais faire fonctionner le script sans avoir à taper quoi que ce soit d'extra dans le shell (comme le '|| echo "Il a échoué"' dans votre exemple) – pafcu

+0

ne répond pas à la question des posters mais était exactement ce que Je cherchais. – rob