11
Scripts / Comment déboguer un script
Dernier message par Rantanplan -Comme la plupart de mes articles, celui-ci, sans prétention, constitue une introduction au débogage avec l'espoir qu'il pourra aider, un peu.
Pour commencer, en début de script, on insère ces deux lignes :
Code: [Sélectionner]
exec 2>[/chemin/nom_du_fichier.txt ou log]
set -x
et à la fin de la partie à déboguer ou du script, on ajoutera :
Code: [Sélectionner]
set +x
C'est le minimum.
Lorsque l'exécution du script s'achève, il reste à ouvrir [/chemin/nom_du_fichier.txt ou log] et à l'analyser pour modifier le programme afin qu'il fonctionnât comme il faut.
Cependant, vous aurez probablement envie de vous donner les moyens d'affiner le débogage.
Par exemple, vous aurez peut-être envie de connaître si une variable n'est pas définie.
Dans ce cas, à la suite du shebang, ajoutez -u, comme ceci :
Code: [Sélectionner]
#! /bin/bash -u
ou, il est possible de l'insérer au début du script :
Code: [Sélectionner]
set -u
set -o nounset
Pour vérifier les erreurs logiques du script, de la même manière que ci-dessus, on pourra ajouter à la suite du shebang :
Code: [Sélectionner]
#! /bin/bash -x
ou, insérer au début du script :
Code: [Sélectionner]
set -x
set -o xtrace
Lors du débogage, chaque ligne de la sortie est précédé d'un signe +.
Ceci peut être modifié au début du script en définissant la variable PS4 de cette manière, par exemple :
Code: [Sélectionner]
PS4=" ==> "
Il est également possible d'orienter la sortie vers un descripteur de fichier, par exemple 6, toujours en début de script.
Compte tenu de ce qui précède, on pourrait lire en début de script :
Code: [Sélectionner]
#! /bin/bash
exec 6> [/chemin/nom_du_fichier.txt ou log]
PS4=' ==> '
BASH_XTRACEFD="6"
set -x
set -u
set -o xtrace
set -o nounset
Pour afficher l'état de sortie tuyau (ou pipe en pas français), on peut encore ajouter une nouvelle ligne.
Par exemple, celle-ci :
Code: [Sélectionner]
set -o pipefail
Enfin, on voudra peut-être que le programme s'arrête lorsqu'un code de sortie non nul est renvoyé.
On insèrera les lignes suivantes :
Code: [Sélectionner]
set -e
ifs_old=$' \n\t' # voir ¹
IFS=$'\n\t'
En conclusion, un script à déboguer pourrait contenir avant le script lui-même ces quelques instructions :
Code: [Sélectionner]
#! /bin/bash
exec 6> [/chemin/nom_du_fichier.txt ou log] # sortie vers le descripteur de fichier 6
PS4=' ==> ' # modif. de PS4 de '+' en ' ==> '
BASH_XTRACEFD="6" # paramétrage de xtrace
set -x # activation du mode xtrace
set -o xtrace # activation du mode xtrace
set -u # erreur en cas de variable non définie
set -o nounset # variable non définie
set -e # sortie du script si retour non nul
set -n # vérification de la syntaxe
set -o noexec # vérification de la syntaxe
set -o pipefail # activation du mode pipefail si retour différent de zéro
ifs_old=$' \n\t' # stockage de la variable IFS d'origine ¹
IFS=$'\n\t' # définition de la variable IFS pour le débogage
et, en fin de script :
Code: [Sélectionner]
set +x # désactive le mode débogage
IFS=$ifs_old # rétablissement de la valeur initiale d'IFS ¹
Pour aller plus loin
On peut encore aller plus loin dans le débogage.
Vous pouvez utilement vous rapporter à la page qui a servie de support à cet article.
Vous la trouverez ici : https://fr.linux-terminal.com/?p=4505
Voilà !
C'est tout pour aujourd'hui.
Amusez-vous bien les p'tits loups.
¹ : pour vérifier la valeur initiale d'IFS, dans un terminal, saisir :
Code: [Sélectionner]
set | grep IFS
. Bien cordialement petihar
.