Main menu:

Site search

Categories

octobre 2009
L M M J V S D
 1234
567891011
12131415161718
19202122232425
262728293031  

Archive

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.