J'ai donc un petit script pour exécuter des tests.
javac *.java && java -ea Test
rm -f *.class
Maintenant, le problème est que lorsque j'exécute le script ./test
, il renvoie un code de sortie de réussite même si le test échoue car il rm -f *.class
réussit.
La seule façon dont je pouvais penser à lui faire faire ce que je veux me semble moche:
javac *.java && java -ea Test
test_exit_code=$?
rm -f *.class
if [ "$test_exit_code" != 0 ] ; then false; fi
Mais cela semble être un problème commun - effectuez une tâche, nettoyez, puis renvoyez le code de sortie de la tâche d'origine.
Quelle est la façon la plus idiomatique de le faire (en bash ou simplement en coquilles en général)?
bash
shell
exit-status
math4tots
la source
la source
eval
est toujours un favori des fans.J'irais avec:
Pourquoi sauter quand
exit
est disponible?Vous pouvez utiliser un
trap
:Par exemple:
la source
exit ${last_error_code:=0}
.Pour autant que je sache, la chose la plus proche que bash a à un
try...finally
bloc d'un langage de programmation plus semblable à C (ce que vous voudriez probablement s'il était disponible) est latrap
construction, qui fonctionne comme ceci:Cela exécutera "rm -f * .class" à la fin de votre script. Si vous avez quelque chose de plus complexe à faire, vous pouvez le mettre dans une fonction:
Si vous êtes si enclin, vous pouvez transformer cela en un idiome assez général qui fonctionne à peu près comme un
try...catch...finally
bloc en C. Quelque chose comme ceci:Notez que les parenthèses délimitent un sous-shell; avec cette construction, seul le sous-shell se ferme si une commande échoue, pas tout le script. N'oubliez pas que les sous-coquilles sont quelque peu coûteuses en termes de calcul, alors n'en utilisez pas trop (des centaines). En fonction de votre script, vous pourrez peut-être obtenir le même effet plus efficacement avec les fonctions shell et
trap ... RETURN
, mais c'est à vous d'enquêter.la source