Débugger un script shell
Plus un programme ou un script devient complexe et plus il devient important d’avoir des outils pour pouvoir le débugger. On connait gdb, le débuggeur de gcc qui avec des commandes simples permet de débugger un programme. Mais gdb n’est pas utilisable avec vos scripts shell. Malheureusement il n’existe pas nativement de débuggeur pour scripts shell. La seule possibilité que vous ayez est d’utiliser les maigres possibilités de bash pour tracer vos programmes.
La première chose que vous pouvez faire est de tester votre script pour trouver toutes les erreurs de syntaxe que vous avez pu faire en tapant le code. Il est possible de demander à bash de vous les donner sans que le script ne soit exécuté. Il suffit pour cela de lancer le script avec l’option -n de bash. Par exemple vous avez tapé dans votre éditeur de texte favori le script suivant:
#!/bin/bash for i in * du file "$i" done
Si vous regardez ce petit script de près, vous vous apercevrez que j’ai tapé du au lieu de do. Si vous lancez le script avec l’option -n, voici ce qui s’affichera dans le terminal:
$ bash -n script.sh /home/michel/bin/script.sh: script.sh: line 4: Erreur de syntaxe près du symbole inattendu « du » /home/michel/bin/script.sh: script.sh: line 4: `du'
Par contre si vous faites une erreur dans la commande file et que vous écrivez fole à la place, bash ne vous dira rien car c’est une commande externe à bash et non pas un mot clé du langage de script.
Il n’ y a pas que les fautes de frappe qui sont détectées par cette option; les vraies erreurs de syntaxe aussi évidemment. Par exemple si vous construisez votre boucle for comme en python:
#!/bin/bash for i in *: file "$i"
Voici le résultat affiché dans la console:
$ bash -n script.sh /home/michel/bin/script.sh: script.sh: line 4: Erreur de syntaxe près du symbole inattendu « file » /home/michel/bin/script.sh: script.sh: line 4: ` file "$i"'
Pour vous aider dans la mise au point de votre script, vous pouvez aussi utiliser l’option -x qui affiche la commande et ses arguments au moment de l’exécution de celle-ci. Reprenons notre script et lançons le avec l’option -x:
#!/bin/bash for i in * do file "$i" done $ bash -x script.sh + for i in '*' + file file1.zip file1.zip: Zip archive data, at least v2.0 to extract + for i in '*' + file image.PNG image.PNG: PNG image, 360 x 280, 8-bit/color RGBA, non-interlaced + for i in '*' + file texte.odt texte.odt: OpenDocument Text + for i in '*' + file 'backup' backup: directory ...
On voit clairement ici que, à chaque étape dans la boucle for, la commande est affichée ainsi que le résultat de celle-ci. Ca permet de tracer le déroulement du programme et voir si, séquentiellement, celui-ci est correct. On peut évidemment ajouter des echo partout où la valeur d’une variable permet de contrôler le flux d’exécution du programme.
Cette option -x peut être introduite directement dans le code source du script et ne doit pas nécessairement être introduit dans la ligne de commande:
#!/bin/bash -x for i in * do file "$i" done
est équivalent lors de l’exécution à:
$ bash -x script.sh
De même, cette option peut être mise à on ou à off à l’intérieur même du script dans le cas où vous ne désiriez pas que bash vous affiche toutes les commandes et le résultat de celles-ci mais seulement d’une petite partie de votre script:
#!/bin/bash set -x #on for i in * do file "$i" done set +x #off
set -x met à on l’affichage des commandes et set +x le met à off.
Il y a aussi la solution que vous écriviez vous-même une fonction plus ou moins intelligente pour vous aidez dans la recherche des erreurs dans vos scripts.
Posted: octobre 24th, 2009 under Ubuntu.
Comments: none
Tweet