Tester les commandes avant de les exécuter dans bash

Est-il possible de tester toutes les commandes de mon script si tout est réussi avant de les exécuter et de les exécuter uniquement si tout est réussi?

Non, au moins pour la définition la plus courante de “réussir”, ce qui signifie qu’ils renvoient tous un code de sortie nul. Considérons un morceau de code qui vérifie si un hôte est disponible, s’il est 12 heures ou si Kenny est toujours en vie. Cela peut être vrai lorsque la vérification est exécutée, mais cela peut très bien être faux lorsque le code “réel” est exécuté.

Pour contourner ce problème, écrivez des tests: créez un environnement autonome avec l’état approprié où vous pouvez faire ce que vous voulez sans détruire les éléments importants, et y exécuter votre script. Si cela semble faire la bonne chose à chaque exécution, vous pouvez au moins avoir la certitude que cela fera le bon choix dans votre environnement de production.

Ce n’est pas possible.

La seule façon de connaître 1 si une commande a échoué est d’examiner le code retour; par exemple la valeur de $? . Mais vous ne pouvez obtenir le code de retour d’un programme qu’après son exécution.

Ce que je pense que vous essayez de faire est de “transactaliser” une séquence de commandes Linux. Ce n’est pas possible car Linux n’est pas transactionnel.


1 – Et même cela n’est pas entièrement fiable. Un programme buggé ne peut pas définir le statut de sortie correctement. Un programme peut penser qu’il a réussi, mais peut produire des réponses incorrectes.

Il suffit de mettre set -x après shebang dans votre script. Il vous fournira des détails de commande par commande dans votre code, qu’ils soient réussis ou non.

Par exemple, la suite est un script.

 cat script.ksh #!/bin/bash set -x echo "Hola!!" find -type f -iname "*.txt" echoi "Done.." echo "Done again.." 

Comme le système ne parvient pas à trouver la commande echoi , il m’a donné l’erreur suivante.

 ./script.ksh: line 6: echoi: command not found 

set -e fait que le script s’arrête immédiatement si un programme externe renvoie un état de sortie non nul. Ceci est utile si votre script tente de gérer tous les cas d’erreur et qu’un échec est à prévoir.

L’erreur suivante viendra au-dessus du script lors de l’utilisation de set -ex .

 + echoi Done.. ./script.ksh: line 6: echoi: command not found