Sam & Max Sam & Max
Menu
Recherche
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!

arrow7 commentaires

  1. 2 moiss, 1 sem plus tôt

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

  2. Sam
    Sam
    2 moiss, 1 sem plus tôt

    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. 2 moiss, 1 sem plus tôt

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

  4. kontre
    2 moiss, 1 sem plus tôt

    Oooooh ! Shiny !

  5. 2 moiss, 1 sem plus tôt

    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
    2 moiss, 1 sem plus tôt

    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. Sam
    Sam
    2 moiss, 1 sem plus tôt

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

Laisser un commentaire