Set -e for the win


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.

7 thoughts on “Set -e for the win

  • Sam Post author

    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.

  • Cladmi

    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

    grep -q -e 'pattern_tres_tres_long' 
        -e 'pattern multiple meme' 
        -e 'avec pleins de choses a trouver' 
        --exclude-dir='houla_lui_on_l_aime_pas' 
        fichier 2>/dev/null
     
    if [[ $? -eq 0 ]]; then
        echo "Ca match, on va faire un traitement"
    else
        echo "Ca me va aussi c'est juste un cas different"
    fi

    Ç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:

    ret=$(grep ... || echo 'OK')
    if [[ "$ret" == "OK" ]]; then
    ...

    C’est moche, je sais, mais j’avais pas trouvé mieux.

  • tmonjalo

    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

  • Sam Post author

    Ahhh. C’est ça que j’avais pas capté. set -o pipefailt, et pas juste set -o. Ok, j’avais mal compris.

Comments are closed.

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.