6. Fin du script et état de sortie

... il existe des coins sombres dans le shell Bourne et les gens les utilisent tous.

-- Chet Ramey

La commande exit met fin au script, exactement comme dans un programme C. Elle peut également renvoyer une valeur, laquelle sera disponible pour le processus parent du script.

Chaque commande renvoie un état de sortie (parfois appelé état de retour). En cas de succès, la commande renvoie un 0, en cas d'échec elle renvoie une valeur non vide, généralement interprétable comme un code d'erreur. Les commandes, programmes et utilitaires UNIX bien réalisés renvoient un code de sortie 0 lors de leur exécution réussie, bien qu'il y ait quelques exceptions.

De même, les fonctions à l'intérieur d'un script, comme le script lui-même, renvoient un état de sortie. La dernière commande exécutée dans la fonction ou le script détermine le état de sortie. À l'intérieur d'un script, une commande exit nnn peut être employée pour renvoyer un état de sortie nnn au shell (nnn doit être un nombre entier compris entre 0 et 255).

[Note]

Note

Lorsqu'un script se termine par un exit sans paramètre, l'état de sortie du script est le code d'état de la dernière commande exécutée dans le script (avant exit).

#!/bin/bash

COMMANDE_1

. . .

COMMANDE_N

# Se terminera avec le code de la dernière commande.

exit

L'équivalent d'un simple exit est exit $?, et on peut même omettre le exit.

#!/bin/bash

COMMANDE_1

. . .

COMMANDE_N

# Se terminera avec le code de la dernière commande.

exit $?
#!/bin/bash

COMMANDE1

. . .

COMMANDE_N

# Se terminera avec le code de la dernière commande.

$? lit l'état de sortie de la dernière commande exécutée. Après la fin d'une fonction, $? donne l'état de sortie de la dernière commande exécutée dans la fonction. C'est ainsi que Bash attribue aux fonctions une « valeur de retour ». [31]

Après un tube nommé, $? fournit l'état de sortie de la dernière commande exécutée.

Après la fin d'un script, $? sur la ligne de commande fournit l'état de sortie du script, c'est-à-dire celui de la dernière commande exécutée dans le script qui est, par convention, 0 en cas de succès ou un entier compris entre 1 et 255 en cas d'erreur.

Exemple 6.1. exit / code d'état de sortie

#!/bin/bash

echo bonjour
echo $?    # Code de sortie 0 renvoyé car la commande s'est correctement
           # exécutée.

lskdf      # Commande non reconnue.
echo $?    # Code de sortie différent de zéro car la commande a échoué.

echo

exit 113   # Renvoie 113 au shell.
           # Pour le vérifier, tapez "echo $?" une fois le script terminé.

#  Par convention, 'exit 0' indique le succès,
#+ tout autre code d'état indiquant soit une erreur, 
#+ soit une circonstance anormale.

$? est particulièrement utile pour tester le résultat d'une commande dans un script (voir l'Exemple 16.35, « Utiliser cmp pour comparer deux fichiers à l'intérieur d'un script. » et l'Exemple 16.20, « Chercher les mots dans une liste pour tester leur validité »).

[Note]

Note

Le !, qualificateur du non logique, inverse le résultat d'un test ou d'une commande, ce qui a une incidence sur l'état de sortie.

Exemple 6.2. Inverser une condition en utilisant !

true    # La commande intégrée "true"
echo "code de sortie de \"true\" = $?"     # 0

! true
echo "code de sortie de \"! true\" = $?"   # 1
# Notez que "!" nécessite une espace entre lui et la commande.
#    !true   renvoie une erreur "commande introuvable"
#
#  L'opérateur '!' préfixant une commande appelle le mécanisme d'historique de
#+ Bash.

true
!true
# Aucune erreur cette fois, mais pas de négation non plus.
# Il répète simplement la précédente commande (true).

# =========================================================== #
# Fire précéder un _tube_ d'un ! inverse le code de sortie renvoyé.
ls | commande_incorrecte     # bash: commande_incorrecte: commande introuvable
echo $?                # 127

! ls | commande_incorrecte     # bash: commande_incorrecte: commande introuvable
echo $?                # 0
# Remarque : le ! ne change rien à l'exécution du tube,
# seul l'état de sortie est modifié.
# =========================================================== #

# Merci à Stéphane Chazelas et à Kristopher Newsome.


[Attention]

Attention

Certains codes d'état de sortie ont une signification particulière, il ne faut pas les utiliser dans les scripts.



[31] Sauf quand la fonction se termine par un return.