Le code de retour d'une suite de commandes est le code de retour de la dernière commande exécutée.
Le code de retour de la suite de commandes cmd1 ; cmd2 ; cmd3 est le code de retour de la commande cmd3.
$ pwd ; ls vi ; echo bonjour /home/sanchis ls: impossible d'accéder à vi: Aucun fichier ou dossier de ce type bonjour $ echo $? 0 => code de retour de echo bonjour $
Il en est de même pour le pipeline cmd1 | cmd2 | cmd3. Le code de retour sera celui de cmd3.
$ cat pass tutu | grep sanchis cat: tutu: Aucun fichier ou dossier de ce type sanchis:x:103:100::/home/sanchis:/bin/bash $ $ echo $? 0 => code de retour de grep sanchis (le code de retour de cat pass tutu est 1) $
Toutefois, il est possible de connaître le code de retour de chacune des commandes composant le pipeline en utilisant le tableau prédéfini PIPESTATUS de bash [cf. Chapitre 12, Tableaux].
Comme le contenu de PIPESTATUS change après exécution de chaque commande, il est nécessaire de le copier dans un autre tableau afin de pouvoir consulter son contenu.
$ cat pass tutu | grep sanchis cat: sanchis:x:103:100::/home/sanchis:/bin/bash tutu: Aucun fichier ou dossier de ce type $ $ svTab=( "${PIPESTATUS[@]}" ) => copie du tableau PIPESTATUS dans le $ => tableau svTab $ echo ${svTab[0]} 1 => code de retour de la commande cat pass tutu $ echo ${svTab[1]} 0 => code de retour de la commande grep sanchis $
La négation d'un code de retour d'un pipeline s'obtient en plaçant le mot-clé ! devant celui-ci. Cela signifie que si le code de retour de pipeline est égal à 0, alors le code de retour de ! pipeline est égal à 1.
$ ! ls pass => le code de retour de ls pass est égal à 0 pass $ $ echo $? 1 $ $ ! cat pass | grep daemon daemon:x:1:1:daemon:/usr/sbin:/bin/sh $ $ echo $? 1 $
Inversement, si le code de retour de pipeline est différent de 0, alors celui de ! pipeline est égal à 0.
$ ! grep sanchis tutu grep: tutu: Aucun fichier ou dossier de ce type $ $ echo $? 0 $