7.4. Code de retour d'une suite de commandes

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
$