10 ans plus tard, je découvre cette option pour les scripts bash.
Voyez vous, quand on écrit un script bash, il exécute les commandes ligne à ligne. Si il y en a une qui retourne une erreur, il continue vaillamment.
Sur un script où chaque ligne dépend de la précédente (comme un script de déploiement), c’est moyen.
Pour y pallier, il suffit de mettre tout en haut du script :
set -e |
Et voilà. Si une commande retourne une erreur, le script s’arrête à ce niveau. 10 ans de Linux et je découvre ça maintenant. Moi content.
Excellent ! À ranger précieusement à côté du
set -x
Et je viens de découvrir “set -o” qui fait que “set -e” marche aussi pour les commandes intermédiares à l’intérieur des pipes.
C’est décidé, tous mes scripts commencerons maintenant par “set -eox”.
EDIT: et merde, -o est pas cross shell. Bon, on oublie -o.
j’ai toujours utiliser le double pipe pour gérer les erreurs
Oooooh ! Shiny !
Le problème que j’ai eu avec ‘set -e’ c’est quand je voulais faire un traitement de la sortie de grep sur une ligne différente. Avec un grep assez long évidemment.
Je trouve ça propre de faire ça comme ça
Ça évite d’avoir le grep compliqué dans le if, mais du coup avec set -e, ça marche pas.
Et pour le faire marcher avec set -e, je me suis retrouvé à faire des trucs ignobles du genre:
C’est moche, je sais, mais j’avais pas trouvé mieux.
set -e marche avec tous les shells mais a des limites, notamment pour les subshells et les pipes.
Avec bash, on peut aller un peu plus loin :
set -o posix # les sous-shells héritent de ces options
set -o errexit # équivalent long de set -e
set -o pipefail # intercepte les erreurs de commandes suivies d’un pipe
Ahhh. C’est ça que j’avais pas capté. set -o pipefailt, et pas juste set -o. Ok, j’avais mal compris.