6135 links
  • GuiGui's Show
  • Home
  • Login
  • RSS Feed
  • ATOM Feed
  • Tag cloud
  • Picture wall
  • Daily
Links per page: 20 50 100
 
  • shell - Get exit status of process that's piped to another - Unix & Linux Stack Exchange [ set -o pipefail ]

    Intéressant : deux programmes, connectés via un pipe et la dernière sort toujours avec le code 0 aka "j'ai fait mon job". Dans un tel cas, une condition de ce genre ne fonctionne pas :

    if mysqldump -u backup -p testbd | gzip -9 > testbd.bak.gz ; then
      echo 'Backup testbd OK';
    else
      echo 'Backup testbd NOK';
    fi

    En effet, même en saisissant un mot de passe incorrect ou autre erreur durant l'extraction depuis la base de données, mysqldump sortira en erreur mais gzip sortira en OK puisque cette commande n'aura rien reçu sur stdin donc pas de travail à faire donc elle aura bien réussi à ne rien faire. :)

    Solutions : soit on teste la valeur de $PIPESTATUS[0] (pour un pipe enchaînant 2 commandes, [0] et [1] pour 3 commandes, etc.) soit, sans changer la structure de notre code, on positionne l'option « pipefail » : set -o pipefail. Elle permet d'obtenir un code de retour = 0 si toutes les commandes d'un pipe ont réussies ou le code de la dernière commande du pipe qui n'est pas sortie en 0.

    ÉDIT DU 15/07/2016 À 23h40 : la rigueur de mon bash-nazi habituel, b4n, m'oblige à vous indiquer que oui, ça fonctionne avec bash, zsh et quelques autres mais que ce n'est pas standard. FIN DE L'ÉDIT.

    July 15, 2016 at 9:49:57 PM UTC - permalink - https://unix.stackexchange.com/questions/14270/get-exit-status-of-process-thats-piped-to-another
Links per page: 20 50 100
 
Mentions légales identiques à celles de mon blog | CC BY-SA 3.0

Shaarli - The personal, minimalist, super fast, database-free, bookmarking service by the Shaarli community