Table des matières
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.
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 ! $