Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
info:bash:pipeline:code_retour [2022/11/12 11:57] – supprimée - modification externe (Unknown date) 127.0.0.1 | info:bash:pipeline:code_retour [2022/12/03 10:50] (Version actuelle) – franck | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ======Gérer les codes retours des commandes en pipelines====== | ||
+ | les pipelines en bash, rappel: Ils permettent d’enchaîner des commandes en passant le résultat (stdout), **mais pas le code retour**, d'une commande a la suivante. | ||
+ | <code bash> | ||
+ | commande 1 | commande 2 | commande 3 .... | ||
+ | </ | ||
+ | exemple: | ||
+ | <code bash> | ||
+ | ls -AdU1 / | ||
+ | echo $? | ||
+ | 0 | ||
+ | </ | ||
+ | Les lignes de commandes avec des pipes renvoi le **code retour de la dernière commande**. dans l' | ||
+ | Pour gérer les codes retours des commandes a l’intérieur des pipelines, il existe des solutions, voir ci-dessous. | ||
+ | =====Le tableau de variables PIPESTATUS[ ]===== | ||
+ | Pour une ligne de commande avec des pipes, le tableau de variable PIPESTATUS[] va afficher le code retour des commandes du pipe, en commençant a 0 pour la première commande.\\ | ||
+ | PIPESTATUS[] se comporte comme un tableau bash.\\ | ||
+ | \\ | ||
+ | A noter pour les exemples: " | ||
+ | \\ | ||
+ | Pour la commande ci-dessous, la variable PIPESTATUS[0] renvoi le code retour de " | ||
+ | <code bash> | ||
+ | true | exit 10 | exit 20 | exit 30 | exit 40 | exit 50 | exit 60 | ||
+ | echo " | ||
+ | 0 | ||
+ | </ | ||
+ | Pour la commande ci-dessous, la variable PIPESTATUS[4] renvoi le code retour de la 5e commande "exit 40", soit 40 | ||
+ | <code bash> | ||
+ | true | exit 10 | exit 20 | exit 30 | exit 40 | exit 50 | exit 60 | ||
+ | echo " | ||
+ | ${PIPESTATUS[4]}=40 | ||
+ | </ | ||
+ | <code bash> | ||
+ | true | exit 10 | exit 20 | exit 30 | exit 40 | exit 50 | exit 60 | ||
+ | echo -e " | ||
+ | \${PIPESTATUS[3]}=${PIPESTATUS[3]}\n\${PIPESTATUS[4]}=${PIPESTATUS[4]}\n\${PIPESTATUS[5]}=${PIPESTATUS[5]}\n\ | ||
+ | \${PIPESTATUS[6]}=${PIPESTATUS[6]}" | ||
+ | ${PIPESTATUS[0]}=0 | ||
+ | ${PIPESTATUS[1]}=10 | ||
+ | ${PIPESTATUS[2]}=20 | ||
+ | ${PIPESTATUS[3]}=30 | ||
+ | ${PIPESTATUS[4]}=40 | ||
+ | ${PIPESTATUS[5]}=50 | ||
+ | ${PIPESTATUS[6]}=60 | ||
+ | |||
+ | </ | ||
+ | Pour afficher tous les codes retour des commandes du pipeline: | ||
+ | <code bash> | ||
+ | true | exit 11 | exit 22 | exit 33 | exit 44 | exit 55 | exit 66 | ||
+ | echo " | ||
+ | 0 11 22 33 44 55 66 | ||
+ | </ | ||
+ | =====option pipefail===== | ||
+ | les codes retours différents de 0 d'une commande a l’intérieur d'un pipeline est souvent un problème notamment dans les scripts ou dans les commandes Ansible.\\ | ||
+ | L' | ||
+ | <code bash> | ||
+ | # | ||
+ | set -o pipefail | ||
+ | .... | ||
+ | grep " | ||
+ | if [[ $? == 0 ]] | ||
+ | do | ||
+ | printf "l execution a réussi\n" | ||
+ | else | ||
+ | printf " | ||
+ | </ | ||
+ | |||
+ | ====pipefail dans une commande Ansible==== | ||
+ | Dans une commande Ansible vous pouvez utiliser l' | ||
+ | Vous pouvez ainsi récupérer le code retour d' | ||
+ | <code yaml> | ||
+ | - name: Recuperer le nom de répertoire numérique de la version la plus élevé dans / | ||
+ | shell: set -o pipefail && cd /opt/{{ rep }}/ && ls -AdU1 ?? | tail -1 | ||
+ | register: rep_version | ||
+ | </ |