Comment les codes de sortie Linux vous aident à écrire des scripts robustes
Sommaire
Résumé
-
Chaque commande Linux renvoie un code de sortie, avec 0 indiquant le succès et les valeurs non nulles indiquant l'échec.
-
Vous pouvez utiliser le $? Variable pour accéder au code de sortie et à la circulation du programme de contrôle dans les scripts.
-
Soyez prudent des codes de sortie non conventionnels qui varient entre les commandes, comme Diff et Curl.
Chaque commande Linux imprimera les messages d'erreur en cas d'échec, mais ces informations sont difficiles à compter. Vos scripts doivent utiliser les codes de sortie pour être aussi robustes que possible.
Que sont les codes de sortie?
Lorsque vous exécutez une commande Linux, elle peut échouer. Les choses peuvent mal tourner pour diverses raisons, mais vous verrez généralement un message expliquant pourquoi:
Le message d'erreur que vous voyez apparaît sur Stderr, un flux différent de Stdout, qui vous permet d'isoler les erreurs de la sortie attendue. En tant qu'utilisateur, une description de l'erreur doit être informative, mais les scripts et autres processus automatisés doivent connaître les erreurs de manière plus fiable.
En rapport
Que sont Stdin, Stdout et Stderr sur Linux?
Mystifié par Stdin, Stdout et Stderr? Apprenez à les utiliser dans vos scripts Linux.
Parallèlement aux messages d'erreur lisibles, chaque commande renvoie également un code de sortie. Il s'agit d'un nombre compris entre 0 et 255 qui indique si la commande a échoué ou réussi. Par défaut, le CoE de sortie est caché, mais votre shell donne accès à cette valeur dans la variable spéciale, $?
Notez qu'une valeur 0 indique le succès et qu'une valeur non nulle signifie une défaillance. Vous pouvez vérifier cette valeur sur la ligne de commande, l'interroger dans un script et l'utiliser pour contrôler le flux de vos programmes.
Comment utiliser les codes de sortie?
Dans l'exemple ci-dessus, LS a renvoyé un code de sortie 0 lorsqu'il a réussi et un 1 lorsque son argument n'était pas un fichier valide. Cela peut sembler contre-intuitif, et cela contredit les langages de programmation typiques qui traitent 0 comme une fausse valeur et 1 comme vrai. Cependant, cette configuration permet une seule valeur de réussite universelle et une large gamme de valeurs pour représenter différents types d'erreur.
En plus de faire écho au $? Variable Pour vérifier manuellement l'état de sortie, vous pouvez l'utiliser avec une instruction IF conditionnelle. Si la commande renvoie un statut de sortie 0, l'instruction exécutera le bloc associé alors. Sinon, s'il y en a un, il exécutera le bloc Else. Par exemple:
if command; then echo "command succeeded"; else echo "command failed"; fi
Vous pouvez utiliser cette construction dans un script shell, où il est un peu plus facile à formater pour la lisibilité:
if command
then echo "command succeeded"
else echo "command failed"
fi
Ceci est l'équivalent de:
commandif ( $? -eq 0 )
then echo "command succeeded"
else echo "command failed"
fi
La version plus longue utilise la syntaxe de la francs carrée pour tester la valeur de $ ?, Mais il est généralement plus facile de tester directement la valeur, comme dans le premier cas. Rappelez-vous que $? représente toujours le code de sortie de la dernière commande, alors soyez prudent. Vous pouvez être tenté de produire la valeur de $? pour le débogage, par exemple
commandecho "command returned exit code:" $?
if ( $? -eq 0 )
then echo "command succeeded"
else echo "command failed"
fi
Mais, au point du chèque de condition, $? aura la valeur du statut de sortie d'Echo, qui est presque garanti de 0. Pour éviter cela, testez la commande directement dans la condition conditionnelle, soit stocker la valeur de $? dans une variable.
En rapport
Comment utiliser bash si les déclarations (avec 4 exemples)
L'énoncé IF est le moyen le plus simple d'explorer l'exécution conditionnelle dans les scripts bash.
Qu'y a-t-il d'autre à savoir sur le statut de sortie?
Les codes de sortie sont assez simples, suivant le principe UNIX, et cela fait partie de leur pouvoir. Mais il y a des gotchas et des cas exceptionnels que vous devriez être conscients.
Codes de sortie de votre shell
Votre shell utilisera les codes de sortie même lorsque la commande que vous tapez ne s'exécute pas correctement. Par exemple, Zsh et Bash utilisent 127 si la commande n'est pas trouvée et 126 si la commande n'est pas exécutable:
Codes de sortie non conventionnels
Certaines commandes plient légèrement les règles du statut de sortie; Ce ne sont vraiment que des conventions, de toute façon. Par exemple, Diff utilise une valeur 0 pour signifier «pas de différences», une valeur de 1 pour signifier des «différences» et une valeur de 2 pour représenter une erreur:
Cela peut confondre le sens des conditions; Par exemple:
if diff file1 file2; then
echo these files are the same!
fi
La commande curl est également un peu inutile. Vous pouvez vous attendre à ce que Curl signale une erreur HTTP, comme un 404 pour une URL inexistante, en tant que code d'état non nulle, mais ce n'est pas le cas:
Vous pouvez utiliser l'option -f (–fail) pour faire en sorte que Curl se comporte différemment, renvoyant un code de sortie de 22 sur l'échec:
Cependant, sachez que ce n'est pas garanti à 100% et que certaines erreurs HTTP, y compris celles nécessitant l'authentification, renverront toujours un code de sortie 0.
Utilisation du statut de sortie dans une chaîne de commande
L'un des meilleurs raccourcis de statut de sortie se produit sans que vous ayez même besoin d'y penser. Voici un exemple simple:
ls program && ./program && echo success || echo epic fail
Le && et || Les opérateurs logiques vous permettent d'exécuter plus d'une commande en fonction de l'état de sortie des autres. Ils sont similaires aux opérateurs correspondants dans la plupart des langages de programmation, mais ils respectent la convention de code de sortie. L'opérateur && exécutera la commande à droite uniquement si la commande à sa gauche renvoie un statut de sortie 0. Le || L'opérateur exécutera la commande à droite uniquement si la commande de sa gauche échoue avec un statut non nul.
Un cas très courant se produit lorsque vous créez des logiciels à partir de zéro, en utilisant cette recette:
./configure && make && make install
Les trois parties de cette commande font ce qui suit:
-
./configure exécute un script local qui inspecte votre environnement et génère un makefile.
-
Make exécute le programme Make et construit le logiciel, en utilisant le MakeFile.
-
Faites des copies d'installation de l'exécutable généré à un emplacement bien connu comme / usr / local / bin.
Si une partie de ce processus échoue, elle s'arrêtera immédiatement sans essayer le reste.
Les commandes vraies et fausses
Votre système Linux comprend deux commandes curieuses: vrai et faux. Chacun d'eux ne fait rien, sauf pour retourner un code de sortie approprié: 0 et 1 respectivement:
Ils peuvent ne pas sembler très utiles, mais ces commandes sont utiles pour les tests et pour certaines tâches de script shell. Vous pouvez utiliser True dans un instant pour créer une boucle infinie:
while true
do
echo “running until you ^c”
sleep 10
done
Vous pouvez également les utiliser avec des opérateurs logiques pour modifier le comportement des commandes. Par exemple, vous pouvez empêcher temporairement une longue chaîne de commande de courir:
false && (none || of-these && commands || will-run)
Ou vous pouvez forcer une chaîne de commande à continuer à fonctionner, même si une commande échoue:
cat file-that-may-not-exist | true && echo done
Renvoi d'un code de sortie de vos propres scripts
Vous avez probablement déjà utilisé la commande d'exit pour quitter votre terminal. Techniquement, il quitte votre shell et cela signifie que vous pouvez également l'utiliser pour arrêter un script shell. Par défaut, vos scripts sortiront avec le même code que la dernière commande:
Mais vous pouvez modifier le code de sortie en passant un paramètre numérique à la commande de sortie:
exit number
Votre script quittera désormais le code d'état que vous avez fourni, et vous pouvez l'utiliser pour communiquer différentes conditions d'erreur de votre programme à d'autres.
Une fois que vous les connaissez, les commandes de sortie sont simples à utiliser. Vous pouvez même les utiliser sans vraiment y penser, mais en ce qui concerne les scripts, assurez-vous d'utiliser les codes de sortie de manière appropriée.