Chapitre 7. Code de retour

Table des matières

7.1. Paramètre spécial ?
7.2. Code de retour d'un programme shell
7.3. Commande interne exit
7.4. Code de retour d'une suite de commandes
7.5. Code de retour d’une commande lancée en arrière-plan
7.6. Résultats et code de retour
7.7. Opérateurs && et || sur les codes de retour

Un code de retour (exit status) est fourni par le shell après exécution d'une commande.

Le code de retour est un entier positif ou nul, compris entre 0 et 255, indiquant si l'exécution de la commande s'est bien déroulée ou s'il y a eu un problème quelconque.

Par convention, un code de retour égal à 0 signifie que la commande s'est exécutée correctement. Un code différent de 0 signifie une erreur syntaxique ou d'exécution.

L’évaluation du code de retour est essentielle à l’exécution de structures de contrôle du shell telles que if et while.

7.1. Paramètre spécial ?

Le paramètre spécial ? (à ne pas confondre avec le caractère générique ?) contient le code de retour de la dernière commande exécutée de manière séquentielle (exécution synchrone).

$ pwd
/home/sanchis
$ echo $?
0           => la commande pwd s'est exécutée correctement
$ ls -l vi
ls: impossible d'accéder à vi: Aucun fichier ou dossier de ce type
$ echo $?
2           => une erreur s’est produite !
$

Chaque commande positionne « à sa manière » les codes de retour différents de 0. Ainsi, un code de retour égal à 1 positionné par la commande unix ls n'a pas la même signification qu'un code de retour égal à 1 positionné par la commande unix grep. Les valeurs et significations du code de retour d’une commande unix ou du shell sont documentées dans les pages correspondantes du manuel (ex : man grep).

Lorsqu'une commande est exécutée en arrière-plan (exécution asynchrone), son code de retour n'est pas mémorisé dans le paramètre spécial ?.

$ pwd               => mise à zéro du paramètre spécial ?
/home/sanchis
$
$ echo $?
0
$ ls -l vi &    => commande exécutée en arrière-plan
[1] 5577
$ ls: impossible d'accéder à vi: Aucun fichier ou dossier de ce type

[1]+  Termine 2                  ls --color=auto -l vi
$
$ echo $?
0
$

On remarque que la commande s'est terminée avec la valeur 2 (Exit 2) mais que ce code de retour n'a pas été enregistré dans le paramètre ?.

La commande interne deux-points (:) sans argument retourne toujours un code de retour égal à 0.

$ :    => commande deux-points
$ echo $?
0
$

Il en est de même avec la commande interne echo : elle retourne toujours un code de retour égal à 0, sauf cas particuliers.

$ 1>&- echo coucou
bash: echo: erreur d'écriture : Mauvais descripteur de fichier
$
$ echo $?
1
$

Enfin, certaines commandes utilisent plusieurs valeurs pour indiquer des significations différentes, comme la commande unix grep.

  • Commande unix grep :

    Cette commande affiche sur sa sortie standard l'ensemble des lignes contenant une chaîne de caractères spécifiée en argument, lignes appartenant à un ou plusieurs fichiers texte (ou par défaut, son entrée standard).

    La syntaxe de cette commande est: grep [ option(s) ] chaîne_cherchée [ fich_texte1 ... ]

    Soit le fichier pass contenant les cinq lignes suivantes :

    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/bin/sh
    bertrand:x:101:100::/home/bertrand:/bin/bash
    albert:x:102:100::/home/albert:/bin/bash
    sanchis:x:103:100::/home/sanchis:/bin/bash
    

    La commande ci-dessous affiche toutes les lignes du fichier pass contenant la chaîne sanchis.

    $ grep sanchis pass
    sanchis:x:103:100::/home/sanchis:/bin/bash
    $
    

    Attention : grep recherche une chaîne de caractères et non un mot.

    $ grep bert pass
    bertrand:x:101:100::/home/bertrand:/bin/bash
    albert:x:102:100::/home/albert:/bin/bash
    $
    

    La commande affiche toutes les lignes contenant la chaîne bert (et non le mot bert).

    Si l’on souhaite la chaîne cherchée en début de ligne, on utilisera la syntaxe ^chaîne_cherchée″. Si on la veut en fin de ligne : ″chaîne_cherchée$

    $ grep ″^bert″ pass
    bertrand:x:101:100::/home/bertrand:/bin/bash
    $
    

    La commande unix grep positionne un code de retour

    • égal à 0 pour indiquer qu'une ou plusieurs lignes ont été trouvées

    • égal à 1 pour indiquer qu'aucune ligne n'a été trouvée

    • égal à 2 pour indiquer la présence d'une erreur de syntaxe ou qu'un fichier mentionné en argument est inaccessible.

    $ grep sanchis pass
    sanchis:x:103:100::/home/sanchis:/bin/bash
    $ echo $?
    0
    $
    $ grep toto pass
    $
    $ echo $?
    1        => la chaîne toto n'est pas présente dans pass
    $
    $ grep sanchis tutu
    grep: tutu: Aucun fichier ou dossier de ce type
    $
    $ echo $?
    2        => le fichier tutu n'existe pas !
    $