Comment déboguer les scripts bash

Comment déboguer les scripts bash

Il existe des techniques à partir d'environnements de programmation traditionnels qui peuvent aider.
Certains outils de base comme l'utilisation d'un éditeur avec mise en évidence de syntaxe aideront également.
Il existe des options intégrées que Bash offre pour faciliter le débogage et votre travail d'administration du système Linux quotidien.

Dans cet article, vous apprendrez quelques méthodes utiles pour déboguer les scripts bash:

  • Comment utiliser les techniques traditionnelles
  • Comment utiliser l'option XTrace
  • Comment utiliser d'autres options de bash
  • Comment utiliser le piège

L'outil de débogage le plus efficace est toujours prudent, associé à des déclarations d'impression judicieusement placées. - Brian Kernighan, «Unix for Beginners» (1979)

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Toute distribution GNU / Linux
Logiciel GNU bash
Autre N / A
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Utiliser des techniques traditionnelles

Le code de débogage peut être délicat, même si les erreurs sont simples et évidentes. Les programmeurs ont traditionnellement profité d'outils tels que les débogueurs et la syntaxe mettant en évidence dans les éditeurs pour les aider. Ce n'est pas différent en écrivant des scripts bash. Le simple fait d'avoir la mise en évidence de la syntaxe vous permettra de prendre des erreurs lorsque vous écrivez le code, vous économisant la tâche qui prend du temps de retrouver les erreurs plus tard.

Certains langages de programmation sont livrés avec des environnements de débogage compagnon, comme GCC et GDB qui vous permettent de parcourir le code, de définir des points d'arrêt, d'examiner l'état de tout à ces points de l'exécution et plus - mais il y a généralement moins besoin d'une approche lourde comme celle-ci avec avec scripts shell puisque le code est simplement interprété au lieu d'être compilé en binaires.

Il existe des techniques utilisées dans des environnements de programmation traditionnels qui peuvent être utiles avec des scripts de bash complexes, comme l'utilisation des assertions. Ce sont essentiellement un moyen d'affirmer explicitement les conditions ou l'état des choses à un moment donné. Les affirmations peuvent identifier même les plus subtiles des bogues. Ils peuvent être implémentés comme une fonction courte qui montre le calendrier, le numéro de ligne et autres, ou quelque chose comme ceci:

$ echo "function_name (): la valeur de \\ $ var est $ var"

Comment utiliser l'option bash xtrace

Lors de l'écriture de scripts shell, la logique de programmation a tendance à être plus courte et est souvent contenue dans un seul fichier. Il y a donc quelques options de débogage intégrées que nous pouvons utiliser pour voir ce qui ne va pas. La première option à mentionner est probablement la plus utile aussi - le xtrace option. Cela peut être appliqué à un script en invoquant un bash avec le -X changer.

$ bash -x 


Cela dit à Bash de nous montrer à quoi ressemble chaque déclaration après l'évaluation, juste avant qu'il ne soit exécuté. Nous verrons un exemple de cela en action sous peu, mais le contraste d'abord -X avec son opposé -V, qui montre chaque ligne avant d'être évaluée à la place après. Les options peuvent être combinées et en utilisant les deux -X et -V Vous pouvez voir à quoi ressemblent les déclarations avant et après les substitutions variables.

Paramètre X et V Options sur la ligne de commande

Remarquez comment utiliser -X et -V Les options ensemble nous permet de voir l'instruction IF originale avant le $ Utilisateur la variable est étendue, grâce au -V option. Nous voyons également sur la ligne en commençant par un signe plus à quoi ressemble la déclaration après la substitution, qui nous montre les valeurs réelles comparées à l'intérieur du si déclaration. Dans des exemples plus compliqués, cela peut être très utile.

Comment utiliser d'autres options de bash

Les options de bash pour le débogage sont désactivées par défaut, mais une fois qu'ils sont activés en utilisant la commande set, ils restent en marche jusqu'à ce qu'ils soient explicitement désactivés. Si vous ne savez pas quelles options sont activées, vous pouvez examiner le $- variable pour voir l'état actuel de toutes les variables.

$ echo $ - Himbhs $ set -xv && echo $ - himvxbhs 

Il existe un autre commutateur utile que nous pouvons utiliser pour nous aider à trouver des variables référencées sans avoir de valeur. C'est le -u changer, et comme -X et -V Il peut également être utilisé sur la ligne de commande, comme nous le voyons dans l'exemple suivant:

Paramètre u Option sur la ligne de commande

Nous avons condamné par erreur une valeur de 7 à la variable appelée «niveau», puis avons essayé de faire écho à une variable nommée «score» qui n'a simplement rien fait d'impression à l'écran. Absolument aucune information de débogage n'a été donnée. Définir notre -u Switch nous permet de voir un message d'erreur spécifique, «Score: variable non liée» qui indique exactement ce qui n'a pas mal tourné.

Nous pouvons utiliser ces options dans des scripts bash courts pour nous donner des informations de débogage pour identifier les problèmes qui ne déclenchent pas autrement les commentaires de l'interprète bash. Profitons quelques exemples.

#!/ bin / bash read -p "chemin à ajouter:" $ path if ["$ path" = "/ home / mike / bin"]; puis écho $ path >> $ path echo "nouveau chemin: $ path" else echo "n'a pas modifié le chemin" fi 
Copie En utilisant X Option lors de l'exécution de votre script bash

Dans l'exemple ci-dessus, nous exécutons normalement le script addpath et il ne modifie tout simplement pas notre CHEMIN. Il ne nous donne aucune indication de pourquoi ou d'indices sur les erreurs commises. L'exécuter à nouveau en utilisant le -X L'option nous montre clairement que le côté gauche de notre comparaison est une chaîne vide. $ chemin est une chaîne vide parce que nous mettons accidentellement un signe en dollars devant "Path" dans notre déclaration de lecture. Parfois, nous regardons juste une erreur comme celle-ci et elle n'a pas l'air mal jusqu'à ce que nous ayons un indice et que nous pensons: «Pourquoi est $ chemin évalué à une chaîne vide?"

En regardant cet exemple suivant, nous n'obtenons également aucune indication d'une erreur de l'interprète. Nous n'obtenons qu'une seule valeur imprimée par ligne au lieu de deux. Ce n'est pas une erreur qui interrompra l'exécution du script, donc nous nous sommes simplement demandé sans recevoir aucun indice. En utilisant le -u Switch, nous obtenons immédiatement une notification que notre variable J n'est pas lié à une valeur. Ce sont donc des épargnants en temps réel lorsque nous faisons des erreurs qui ne se traduisent pas par des erreurs réelles du point de vue de l'interprète bash.

#!/ bin / bash pour i in 1 2 3 do echo $ i $ j fait 
Copie En utilisant u option exécutant votre script à partir de la ligne de commande

Maintenant, vous pensez sûrement que cela semble bien, mais nous avons rarement besoin d'aide pour déboguer les erreurs faites dans les one-liners sur la ligne de commande ou dans des scripts courts comme ceux-ci. Nous avons généralement du mal à déboguer lorsque nous traitons avec des scripts plus longs et plus compliqués, et nous avons rarement besoin de définir ces options et de les laisser régler pendant que nous exécutons plusieurs scripts. Paramètre -xv Les options puis exécuter un script plus complexe ajouteront souvent de la confusion en doublant ou triplé la quantité de sortie générée.

Heureusement, nous pouvons utiliser ces options de manière plus précise en les plaçant dans nos scripts. Au lieu d'invoquer explicitement un shell bash avec une option de la ligne de commande, nous pouvons définir une option en l'ajoutant à la ligne Shebang à la place.

#!/ bin / bash -x

Cela définira le -X Option pour l'ensemble du fichier ou jusqu'à ce qu'elle ne soit pas défini pendant l'exécution du script, vous permettant simplement d'exécuter le script en tapant le nom de fichier au lieu de le passer à Bash en tant que paramètre. Un long script ou celui qui a beaucoup de sortie deviendra toujours difficile à manier en utilisant cette technique, alors regardons une façon plus spécifique d'utiliser les options.



Pour une approche plus ciblée, entourez uniquement les blocs de code suspects avec les options que vous souhaitez. Cette approche est idéale pour les scripts qui génèrent des menus ou une sortie détaillée, et il est accompli en utilisant le mot-clé SET avec plus ou moins une fois de plus.

#!/ bin / bash read -p "chemin à ajouter:" $ path set -xv if ["$ path" = "/ home / mike / bin"]; puis echo $ path >> $ path echo "nouveau chemin: $ path" else echo "n'a pas modifié le chemin" fi set + xv 
Copie Emballage des options autour d'un bloc de code dans votre script

Nous avons entouré uniquement les blocs de code que nous soupçonnons afin de réduire la sortie, ce qui facilite notre tâche dans le processus. Remarquez que nous activons nos options uniquement pour le bloc de code contenant notre instruction if-then-else, puis éteignez la ou les options à la fin du bloc suspect. Nous pouvons allumer et désactiver ces options plusieurs fois dans un seul script si nous ne pouvons pas affiner les zones suspectes, ou si nous voulons évaluer l'état des variables à différents moments à mesure que nous progressons dans le script. Il n'est pas nécessaire de désactiver une option si nous voulons qu'il continue pour le reste de l'exécution du script.

Par souci d'exhaustivité, nous devons également mentionner qu'il y a des débogueurs écrits par des tiers qui nous permettra de parcourir l'exécution du code ligne par ligne. Vous voudrez peut-être enquêter sur ces outils, mais la plupart des gens constatent qu'ils ne sont pas réellement nécessaires.

Comme les programmeurs chevronnés le suggèrent, si votre code est trop complexe pour isoler les blocs suspects avec ces options, le vrai problème est que le code doit être refactorisé. Le code trop complexe signifie que les bogues peuvent être difficiles à détecter et la maintenance peut prendre du temps et coûteux.

Une dernière chose à mentionner concernant les options de débogage de bash est qu'une option globbing de fichier existe également et est définie avec -F. La définition de cette option éteindra le globe (extension des caractères génériques pour générer des noms de fichiers) pendant qu'il est activé. Ce -F L'option peut être un commutateur utilisé sur la ligne de commande avec bash, après le shebang dans un fichier ou, comme dans cet exemple pour entourer un bloc de code.

#!/ bin / bash echo "Ignorer l'option de gobele 
Copie En utilisant F Option pour désactiver le fichier global

Comment utiliser le piège pour aider à déboguer

Il existe des techniques plus impliquées à considérer si vos scripts sont compliqués, notamment en utilisant une fonction d'affirmation comme mentionné précédemment. Une telle méthode à garder à l'esprit est l'utilisation du piège. Les scripts de coquille nous permettent de piéger les signaux et de faire quelque chose à ce moment-là.

Un exemple simple mais utile que vous pouvez utiliser dans vos scripts bash est de piéger SORTIE.

#!/ score d'écho bin / bash 'est $ score, le statut est $ statut' exit si [-z 1 $]; alors status = "default" else status = $ 1 fi score = 0 if [$ user = 'superman']; puis score = 99 elif [$ # -gt 1]; puis score = 2 $ fi 
Copie Utilisation du piège SORTIE Pour aider à déboguer votre script

Comme vous pouvez le voir, le simple fait de vider les valeurs actuelles des variables à l'écran peut être utile pour montrer où votre logique échoue. Le SORTIE Le signal n'a évidemment pas besoin d'un sortie déclaration à générer; Dans ce cas, le écho L'instruction est exécutée lorsque la fin du script est atteinte.

Un autre piège utile à utiliser avec les scripts bash est DÉBOGUER. Cela se produit après chaque instruction, il peut donc être utilisé comme moyen de force brute pour afficher les valeurs des variables à chaque étape de l'exécution du script.

#!/ bin / bash trap 'echo "line $ lineno: le score est $ score"' debug score = 0 if ["$ user" = "mike"]; alors laissez "Score + = 1" fi let "score + = 1" si ["1 $" = "7"]; puis score = 7 Fi Exit 0 
Copie Utilisation du piège DÉBOGUER Pour aider à déboguer votre script

Conclusion

Lorsque vous remarquez que votre script bash ne se comporte pas comme prévu et que la raison ne vous est pas claire pour une raison quelconque, considérez quelles informations seraient utiles pour vous aider à identifier la cause, utilisez les outils les plus confortables disponibles pour vous aider à identifier le problème. L'option xtrace -X est facile à utiliser et probablement les options les plus utiles présentées ici, alors pensez à l'essayer la prochaine fois que vous serez confronté à un script qui ne fait pas ce que vous pensiez.

Tutoriels Linux connexes:

  • Comment propager un signal aux processus d'enfants à partir d'un bash…
  • Masterring Bash Script Loops
  • Comment effectuer des opérations d'administration avec Ansible…
  • Boucles imbriquées dans les scripts bash
  • Comment utiliser des sous-coquilles bash à l'intérieur des instructions IF
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à installer sur Ubuntu 20.04
  • Comment utiliser ADB Android Debug Bridge pour gérer votre Android…
  • Bash si déclarations: si, elif, sinon, alors, fi
  • Optimisation des performances de Linux: outils et techniques