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[3] (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).

Lorsque 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 !
    $



[3] Ce texte est paru sous une forme légèrement différente dans la revue « Linux Magazine France », n°39, mai 2002