Le shell propose quelques options qui permettent de débugger des scripts shell.
L'option -x permet de débugger un script shell en affichant l'exécution des commandes après traitement des caractères spéciaux du shell.
Les différentes syntaxes permettant d'activer l'option -x :
Activer l'option
Désactiver l'option
Exemple :
Dans l'exemple suivant, la variable fichier n'a pas été préfixée par le symbole $.
$ nl liste.sh
1 #!/bin/bash
2 for fichier in `ls`
3 do
4 if [[ -f fichier ]]
5 then
6 echo "$fichier"
7 fi
8 done
$
L'exécution du script ne retourne aucun résultat malgré la présence de fichiers dans le dossier d'exécution du script.
$ ./liste.sh
$
L'exécution du script avec activation de l'option -x démontre effectivement que la variable fichier n'est pas remplacée par sa valeur.
$ bash -x liste.sh
++ ls
+ for fichier in '`ls`'
+ [[ -f fichier ]]
+ for fichier in '`ls`'
+ [[ -f fichier ]]
+ for fichier in '`ls`'
+ [[ -f fichier ]]
...
$
L'activation de l'option de débuggage peut également être lancée directement dans le script.
$ nl liste.sh
1 #!/bin/bash
2 set -x
3 for fichier in `ls`
4 do
5 if [[ -f fichier ]]
6 then
7 echo "$fichier"
8 fi
9 done
$
Après correction de l'erreur et exécution du script en mode débuggage.
$ nl liste.sh
1 #!/bin/bash
2 set -x
3 for fichier in `ls`
4 do
5 if [[ -f "$fichier" ]]
6 then
7 echo "$fichier"
8 fi
9 done
$ ./liste.sh
++ ls
+ for fichier in '`ls`'
+ [[ -f 1coucou ]]
+ echo 1coucou
1coucou
+ for fichier in '`ls`'
+ [[ -f 24902 ]]
+ for fichier in '`ls`'
+ [[ -f 25013 ]]
+ for fichier in '`ls`'
+ [[ -f 25031 ]]
+ for fichier in '`ls`'
+ [[ -f 25043 ]]
+ for fichier in '`ls`'
+ [[ -f comparaison2.sh ]]
+ echo comparaison2.sh
comparaison2.sh
...
$
Fonction | Bourne shell, ksh, bash | ksh, bash |
---|---|---|
Lecture des commandes sans exécution et détection des erreurs de syntaxe. | set -n set +n |
set -o noexec set +o noexec |
Affichage des commandes avant substitution des caractères spéciaux du shell | set -v set +v |
set -o verbose set +o verbose |
Exemple :
Dans l'exemple suivant, un guillemet a été volontairement omis.
$ nl liste.sh
1 #!/bin/bash
2 set -n
3 for fichier in `ls`
4 do
5 if [[ -f "$fichier ]]
6 then
7 echo "$fichier"
8 fi
9 done
$ ./liste.sh
./liste.sh: line 7: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « " » correspondant
./liste.sh: line 10: argument inattendu pour l'opérateur conditionnel à un argument
./liste.sh: line 10: Erreur de syntaxe : fin de fichier prématurée
$
$ nl liste.sh
1 #!/bin/bash
2 set -v
3 for fichier in `ls`
4 do
5 if [[ -f "$fichier ]]
6 then
7 echo "$fichier"
8 fi
9 done
$ ./liste.sh
for fichier in `ls`
do
if [[ -f "$fichier ]]
then
echo "$fichier"
fi
done
./liste.sh: line 7: Caractère de fin de fichier (EOF) prématuré lors de la recherche du « " » correspondant
./liste.sh: line 10: argument inattendu pour l'opérateur conditionnel à un argument
./liste.sh: line 10: Erreur de syntaxe : fin de fichier prématurée
$