Débuguer (ou déboguer ou débugger comme vous voulez) un script en bash (ou script shell) est souvent fastidieux ; on a souvent l'impression que les variables n'en font qu'à leur tête et il faut souvent reprendre un long script ligne à ligne pour voir ce qui cloche en ajoutant des "echo" pour contrôler le contenu des variables.
En lançant vos scripts avec l'option -x c'est fini !
Pour ce faire 2 méthodes :
Dans un cas comme dans l'autre l'affichage passera en mode debug : vous verrez l'ensemble des programmes lancés avec les différents niveaux d'imbrication (matérialisés par des +) et verrez ainsi si vous êtes bien passé dans tel ou tel bloc, si telle ou telle boucle s'est arrêtée à temps, les valeurs des variables, etc.
C'est l'option à garder en tête quand vous faites du scripting bash.
Le jour où je l'ai découverte celle là j'étais heureux :D
Ci-dessous un exemple de script avec respectivement sa sortie standard en temps normal et avec l'option de debug...
#! /bin/sh
a=34
while [ "$a" -lt 40 ]; do
a=`expr $a + 1`
done
echo "a vaut $a"
affichera :
a vaut 40
Si on le lance en debug...
bash -x test.sh
... affichera :
+ a=34
+ '[' 34 -lt 40 ']'
++ expr 34 + 1
+ a=35
+ '[' 35 -lt 40 ']'
++ expr 35 + 1
+ a=36
+ '[' 36 -lt 40 ']'
++ expr 36 + 1
+ a=37
+ '[' 37 -lt 40 ']'
++ expr 37 + 1
+ a=38
+ '[' 38 -lt 40 ']'
++ expr 38 + 1
+ a=39
+ '[' 39 -lt 40 ']'
++ expr 39 + 1
+ a=40
+ '[' 40 -lt 40 ']'
+ echo 'a vaut 40'
a vaut 40
Magique n'est-il pas ?
En lançant vos scripts avec l'option -x c'est fini !
Pour ce faire 2 méthodes :
- Soit changer le "shebang" à l'intérieur du fichier (la première ligne du script indiquant comment interpréter le fichier) :
- Soit lancer le script (même si celui-ci contient un shebang traditionnel de type /bin/sh ou /bin/bash) comme ceci
Dans un cas comme dans l'autre l'affichage passera en mode debug : vous verrez l'ensemble des programmes lancés avec les différents niveaux d'imbrication (matérialisés par des +) et verrez ainsi si vous êtes bien passé dans tel ou tel bloc, si telle ou telle boucle s'est arrêtée à temps, les valeurs des variables, etc.
C'est l'option à garder en tête quand vous faites du scripting bash.
Le jour où je l'ai découverte celle là j'étais heureux :D
Ci-dessous un exemple de script avec respectivement sa sortie standard en temps normal et avec l'option de debug...
#! /bin/sh
a=34
while [ "$a" -lt 40 ]; do
a=`expr $a + 1`
done
echo "a vaut $a"
affichera :
a vaut 40
Si on le lance en debug...
bash -x test.sh
... affichera :
+ a=34
+ '[' 34 -lt 40 ']'
++ expr 34 + 1
+ a=35
+ '[' 35 -lt 40 ']'
++ expr 35 + 1
+ a=36
+ '[' 36 -lt 40 ']'
++ expr 36 + 1
+ a=37
+ '[' 37 -lt 40 ']'
++ expr 37 + 1
+ a=38
+ '[' 38 -lt 40 ']'
++ expr 38 + 1
+ a=39
+ '[' 39 -lt 40 ']'
++ expr 39 + 1
+ a=40
+ '[' 40 -lt 40 ']'
+ echo 'a vaut 40'
a vaut 40
Magique n'est-il pas ?