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.