Observer les codes de retour
Comprendre et exploiter les codes de retour d’une commande.
Objectifs
À la fin de cette leçon, vous saurez :
- comprendre que chaque commande se termine par un code de retour ;
- lire ce code avec
echo $?; - distinguer succès (0) et échec (autre valeur) ;
- utiliser
&&,||et;en conséquence.
🔗 Pour vous rafraîchir la mémoire : manipulation de fichiers (cp, mv, rm) · lecture de fichiers et aide (cat, grep, man) · redirections et pipes
Chaque commande se termine par un code
Quand une commande se termine, elle laisse derrière elle un code de retour : une valeur entière, disponible dans la variable spéciale $? du shell.
ls /home
echo $?
Le résultat est :
0
La règle de base
0 = succès
toute autre valeur = erreur
Observez :
ls /home
echo $? # 0
ls /dossier-inexistant
echo $? # 2 (par exemple)
La commande qui échoue affiche souvent un message d'erreur en plus. Le message informe l'utilisateur ; le code informe le programme. Les deux sont complémentaires.
Où vivent ces codes ?
Un processus se termine avec un entier :
0: tout s'est bien passé ;1: erreur générique ;2: mauvaise utilisation (le plus souvent, un mauvais argument) ;127: commande introuvable ;130: interrompu par l'utilisateur (Ctrl+C).
Le code est rempli par la commande elle-même. Un script ou un programme peut décider d'adopter les mêmes conventions :
if (echoué) {
process.exit(1);
}
Utiliser les codes dans une ligne
Une intention formulée en français — « prépare un dossier de test, liste son contenu, puis nettoie ; adapte la suite selon le résultat » — se traduit avec trois opérateurs différents :
mkdir /tmp/test-cours && ls /tmp/test-cours # la 2e ne tourne que si la 1re réussit
rm /tmp/test-cours || echo "échec du nettoyage" # l'écho ne tourne que si la 1re échoue
date ; grep dos /etc/hosts # les deux tournent, sans condition
&&vérifie le code de retour de la première.||exécute seulement en cas de code non nul.;enchaîne sans vérifier.
Test pratique
which node
which programme-inconnu
echo $?
which programme-inconnu n'affiche rien (ou une erreur), et $? renvoie 1 : le programme n'existe pas dans le chemin de recherche. C'est un test fiable en une ligne :
which node && echo "node est prêt"
Exercice
- Exécutez
ls /etcpuisecho $?: notez la valeur. - Exécutez
ls /etc/zazouxpuisecho $?: notez la valeur et comparez. - Testez
cd / && echo $?puiscd /impossibleet relisez$?. - Écrivez une ligne qui affiche « réseau ok » si
which curlréussit, « curl manquant » sinon. - Expliquez pourquoi une commande qui n'a rien affiché peut avoir un code de retour 0.
Résumé
- Chaque processus rend un code : 0 = succès, ≠ 0 = échec.
echo $?relit le code de retour de la dernière commande.&&n'enchaîne que sur la réussite (code 0),||seulement sur l'échec (code ≠ 0),;sans condition.- Les codes permettent au shell d'automatiser des vérifications.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Exercice 1. ls /etc → 0. La liste réussit.
Exercice 2. ls /etc/zazoux → valeur non nulle (exemple : 2). Le chemin n'existe pas ; la commande échoue. La valeur exacte peut varier : l'essentiel est différent de 0.
Exercice 3. cd / → 0. cd /impossible → 1 ou 2 : le chemin est inaccessible. Lisez $? immédiatement après la commande visée : toute nouvelle commande écrase sa valeur.
Exercice 4.
which curl && echo "réseau ok" || echo "curl manquant"
En réalité, cette forme composée a une limite : si une commande de la branche « succès » échouait à son tour, le || prendrait aussi la main. On peut écrire plus explicitement :
if which curl; then echo "réseau ok"; else echo "curl manquant"; fi
Les deux fonctionnent ; la deuxième est plus facile à lire.
Exercice 5. Parce que le code de retour décrit le bon déroulement, pas la quantité de texte affichée. Exemple : true n'affiche rien et rend 0 ; ls sur un dossier entièrement vide n'affiche aucune ligne et rend 0. Une commande peut réussir parfaitement tout en n'affichant rien.