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 ou 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.

No related posts.

flattr this!

7 comments

  1. Excellent ! À ranger précieusement à côté du set -x

  2. 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.

  3. j’ai toujours utiliser le double pipe pour gérer les erreurs

  4. kontre

    Oooooh ! Shiny !

  5. 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.

  6. 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

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

Flux RSS des commentaires

Leave a Reply

Your email address will not be published. Required fields are marked *

*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Jouer à mario en attendant que les autres répondent