Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

tutoriel:programmation:deboguage:bash:start [2022/06/04 17:38] – [Comment déboguer un script bash avec l'option noexec (-n)] admintutoriel:programmation:deboguage:bash:start [2022/08/13 22:15] (Version actuelle) – modification externe 127.0.0.1
Ligne 227: Ligne 227:
 S'il n'y a pas d'erreur de syntaxe, le code ne sera pas exécuté. S'il n'y a pas d'erreur de syntaxe, le code ne sera pas exécuté.
  
-Changeons maintenant notre code :<code - >+Changeons maintenant notre code :<code - b_script.sh>
 #! /bin/bash #! /bin/bash
 echo "Enter number1" echo "Enter number1"
Ligne 243: Ligne 243:
 fi fi
 </code> </code>
 +
 +Je commente le **then** après **elif**.
 +
 +Maintenant exécutez le script **b_script.sh** avec **-n** :<cli prompt='$ '>...@...:~ $ bash -n /media/tmp/b_script.sh 
 +/media/tmp/b_script.sh: ligne 12: erreur de syntaxe près du symbole inattendu « else »
 +/media/tmp/b_script.sh: ligne 12: `else'
 +</cli>
 +
 +Comme prévu, il a clairement identifié l'erreur et l'a affichée dans le terminal.
 ==== Comment détecter les variables non définies lors du débogage d'un script bash ==== ==== Comment détecter les variables non définies lors du débogage d'un script bash ====
  
 +Une faute de frappe lors de l'écriture de code est une chose courante.
 +
 +Souvent, vous entrez par erreur une variable, ce qui empêche l'exécution du code.
 +
 +Pour détecter une telle erreur, nous utilisons l'option -u.
 +
 +Changeons à nouveau le code :<code - >
 +#! /bin/bash
 +echo "Enter number1"
 +read number1
 +echo "Enter number2"
 +read number2
 +if [ "$num1" -gt "$number2" ]
 +then
 +echo "Number1 greater than number2"
 +elif [ "$number1" -eq "$number2" ]
 +then
 +echo "Number1 is equal to Number2"
 +else
 +echo "Number2 is greater than Number1"
 +fi</code>
 +
 +Tout d'abord, dans l'expression conditionnelle **if**, j'ai renommé la variable **number1** en **num1**.
 +
 +Maintenant **num1** est une variable non définie.
 +
 +Exécutons maintenant le script :<cli prompt='$ '>...@...:~ $ bash -u /media/tmp/b_script.sh 
 +Enter number1
 +4
 +Enter number2
 +6
 +/media/tmp/b_script.sh: ligne 6: num1 : variable sans liaison
 +</cli>
 +
 +La sortie identifie et affiche explicitement le nom de la variable non définie.
 ==== Comment déboguer une partie spécifique d'un script bash ==== ==== Comment déboguer une partie spécifique d'un script bash ====
  
-==== Comment déboguer un script bash à l'aide de la commande hook ====+Le mode xtrace traite chaque ligne de code et produit un résultat.
  
 +Cependant, trouver des bogues dans un code volumineux prendra du temps si nous savons déjà quelle partie est potentiellement à l'origine du bogue.
 +
 +Heureusement, xtrace vous permet également de déboguer un morceau de code spécifique, ce qui peut être fait avec la commande **installed**.
 +
 +Placez **set -x** au début de la partie que vous devez déboguer, puis **set +x** à la fin.
 +
 +Par exemple, pour déboguer les instructions conditionnelles de **b_script.sh** , enveloppez toutes les conditions entre **set -x** et **set +x** comme indiqué dans le code ci-dessous :<code - b_script.sh>
 +#! /bin/bash
 +echo "Enter number1"
 +read number1
 +echo "Enter number2"
 +read number2
 +set -x
 +if [ "$number1" -gt "$number2" ]
 +then
 +echo "Number1 greater than number2"
 +elif [ "$number1" -eq "$number2" ]
 +then
 +echo "Number1 is equal to Number2"
 +else
 +echo "Number2 is greater than Number1"
 +fi
 +set +x</code>
 +
 +Maintenant lancez le script :<cli prompt='$ '>...@...:~ $ bash /media/tmp/b_script.sh 
 +Enter number1
 +7
 +Enter number2
 +3
 ++ '[' 7 -gt 3 ']'
 ++ echo 'Number1 greater than number2'
 +Number1 greater than number2
 ++ set +x
 +</cli>
 +
 +La sortie est juste un débogage des conditions if comme indiqué.
 +==== Comment déboguer un script bash à l'aide de la commande trap ====
 +
 +Si votre script est complexe, il existe des méthodes de débogage plus avancées.
 +
 +L'une d'entre elles est la commande **trap**.
 +
 +La commande **trap** capte les signaux et exécute la commande lorsqu'une situation spécifique se produit.
 +
 +La commande peut être un signal ou une fonction.
 +
 +J'ai créé un autre script appelé **sum_script.sh** :<code - sum_script.sh>
 +#! /bin/bash
 +trap 'echo "Line ${LINENO}: first number is $number1, second number is $number2, and sum is $sum" ' DEBUG
 +echo "Enter first number"
 +read number1
 +echo "Enter second number"
 +read number2
 +sum = $[number1 + number2]
 +echo "The sum is $sum"</code>
 +
 +La commande **trap** avec le signal **DEBUG** affiche l'état des variables **number1** , **number2** et **sum** après l'exécution de chaque ligne, comme illustré dans l'image de sortie suivante :<cli prompt='$ '>...@...:~ $ bash sum_script.sh 
 +Line 3: first number is , second number is , and sum is 
 +Enter first number
 +Line 4: first number is , second number is , and sum is 
 +4
 +Line 5: first number is 4, second number is , and sum is 
 +Enter second number
 +Line 6: first number is 4, second number is , and sum is 
 +2
 +Line 7: first number is 4, second number is 2, and sum is 
 +Line 8: first number is 4, second number is 2, and sum is 6
 +The sum is 6</cli>
 +
 +Lignes 3, 4, 5, 6 et 7, les espaces après le mot "is" sont vides car l'utilisateur n'a pas encore entré de données ; ces espaces seront remplis au fur et à mesure que l'utilisateur saisira les valeurs.
 +
 +Cette méthode est également très utile lors du débogage de scripts bash.
 ==== Comment déboguer un script bash sans substitution de fichier à l'aide de l'option -f ==== ==== Comment déboguer un script bash sans substitution de fichier à l'aide de l'option -f ====
  
 +La substitution de fichiers est le processus de recherche de fichiers avec des caractères génériques, c'est-à-dire * et ?.
  
 +Dans de nombreux cas, vous n'avez pas besoin de développer les fichiers pendant le débogage.
 +
 +Dans de tels cas, vous pouvez bloquer la substitution de fichiers avec l'option -f.
 +
 +Voyons le script :<code bash fglobe_script.sh>
 +#! /bin/bash
 +
 +echo "Display all text files"
 +ls *.txt</code>
 +
 +Le code ci-dessus affichera tous les fichiers texte du répertoire courant :<cli prompt='$ '>...@...:~ $ bash fglobe_script.sh 
 +Display all text files
 +Doc1.txt  Doc2.txt  Doc3.txt</cli>
 +
 +Pour désactiver la substitution de fichiers, utilisez l'option -f :<cli prompt='$ '>...@...:~ $ bash -f fglobe_script.sh 
 +Display all text files
 +ls: impossible d'accéder à '*.txt': Aucun fichier ou dossier de ce type</cli>
 +
 +De même, vous pouvez l'utiliser avec un shebang ou avec la commande set :<code bash fglobe_script.sh>#! /bin/bash
 +
 +set -f
 +echo "Display all text files"
 +ls *.txt
 +set +f</code>
 +
 +Exécutez maintenant bash fglobe_script.sh :<cli prompt='$ '>...@...:~ $ bash fglobe_script.sh 
 +Display all text files
 +Doc1.txt  Doc2.txt  Doc3.txt
 +Display all text files
 +ls: impossible d'accéder à '*.txt': Aucun fichier ou dossier de ce type</cli>
 ==== Comment combiner les options de débogage pour déboguer un script shell ==== ==== Comment combiner les options de débogage pour déboguer un script shell ====
  
 +Nous n'utilisons qu'une seule option dans les méthodes de débogage ci-dessus, mais nous pouvons combiner différentes options pour une meilleure compréhension.
 +
 +Implémentons les variantes **-x** et **-v** du script **sum_script.sh**. J'utilise le script **sum_script.sh** :<code bash script.sh>
 +#! /bin/bash
 +echo "Enter first number"
 +read number1
 +echo "Enter second number"
 +read number2
 +sum=$[number1 + number2]
 +echo "The sum is $sum"</code>
 +
 +Maintenant, lancez :<cli prompt='$ '>...@...:~ $ bash -xv sum_script.sh 
 +#! /bin/bash
 +echo "Enter first number"
 ++ echo 'Enter first number'
 +Enter first number
 +read number1
 ++ read number1
 +4
 +echo "Enter second number"
 ++ echo 'Enter second number'
 +Enter second number
 +read number2
 ++ read number2
 +8
 +sum=$[number1 + number2]
 ++ sum=12
 +echo "The sum is $sum"
 ++ echo 'The sum is 12'
 +The sum is 12</cli>
 +
 +Les sorties **-x** et **-v** sont combinées comme indiqué dans l'image de sortie.
 +
 +De même, nous pouvons combiner l'option **-u** avec verbose -v pour détecter les erreurs.
 +
 +Je remplace la variable number1 par num sur la sixième ligne du script :<code bash sum_script.sh>
 +#! /bin/bash
 +echo "Enter first number"
 +read number1
 +echo "Enter second number"
 +read number2
 +sum=$[num + number2]
 +echo "The sum is $sum"</code>
 +
 +Pour afficher le résultat, exécutez la commande suivante :<cli prompt='$ '>...@...:~ $ bash -uv sum_script.sh 
 +#! /bin/bash
 +echo "Enter first number"
 +Enter first number
 +read number1
 +5
 +echo "Enter second number"
 +Enter second number
 +read number2
 +7
 +sum=$[num + number2]
 +sum_script.sh: ligne 6: num : variable sans liaison</cli>
 ==== Comment rediriger le rapport de débogage vers un fichier ==== ==== Comment rediriger le rapport de débogage vers un fichier ====
  
 +L'enregistrement d'un rapport de débogage de script bash dans un fichier peut être utile dans de nombreuses situations.
 +
 +C'est un peu délicat car rediriger le rapport de débogage vers un fichier ; nous utilisons des variables spéciales.
 +
 +Implémentons-le sur le code b_script.sh :<code - >
 +#! /bin/bash
 +exec 5> debug_report.log
 +PS4='$LINENO-- '
 +BASH_XTRACEFD="5"
 +echo "Enter number1"
 +read number1
 +echo "Enter number2"
 +read number2
 +if [ "$number1" -gt "$number2" ]
 +then
 +echo "Number1 greater than number2"
 +elif [ "$number1" -eq "$number2" ]
 +then
 +echo "Number1 is equal to Number2"
 +else
 +echo "Number2 is greater than Number1"
 +fi</code>
 +
 +Dans la deuxième ligne de code, vous pouvez voir que nous redirigeons la sortie vers le fichier debug_report.log à l'aide de la commande exec avec le descripteur de fichier 5 (FD5).
 +
 +  * **exec 5> debug_report.log** : Dans exec , la commande redirige tout ce qui se passe dans le shell vers le fichier debug_report.log.
 +  * **BASH_XTRACEFD = 5** : variable spécifique à bash qui ne peut être utilisée dans aucun autre shell. Un descripteur de fichier valide doit lui être attribué et bash écrira la sortie extraite dans debug_report.log.
 +  * **PS4='$LINENO– '** : variable bash utilisée pour imprimer le numéro de ligne lors du débogage en mode xtrace. PS4 par défaut : signe +
 +
 +Le script ci-dessus crée un fichier journal nommé debug_report.log, pour le lire, utilisez la commande cat :<cli prompt='$ '>...@...:~ $ bash -x b_script.sh 
 ++ exec
 ++ PS4='$LINENO-- '
 +4-- BASH_XTRACEFD=5
 +Enter number1
 +4
 +Enter number2
 +5
 +Number2 is greater than Number1
 +...@...:~ $  cat debug_report.log 
 +5-- echo 'Enter number1'
 +6-- read number1
 +7-- echo 'Enter number2'
 +8-- read number2
 +9-- '[' 4 -gt 5 ']'
 +12-- '[' 4 -eq 5 ']'
 +16-- echo 'Number2 is greater than Number1'
 +</cli>
 ===== Pré-requis ===== ===== Pré-requis =====
  
Ligne 265: Ligne 515:
 ===== Conclusion ===== ===== Conclusion =====
  
 +Un code plein d'erreurs peut affecter les performances du programme ou nuire au matériel.\\
 +Le débogage est très important pour chaque programme car il le rend plus efficace.\\
 +La détection de bogues existants et potentiels pendant le développement du programme peut empêcher un comportement inattendu dans votre programme.\\
 +Les codes volumineux nécessitent généralement un débogage actif, ce qui améliore l'efficacité du code en éliminant les fragments de code consommateurs de ressources.
 +
 +De nombreux langages de programmation et frameworks ont leurs propres débogueurs compagnons.\\
 +Les scripts bash peuvent implémenter diverses méthodes de débogage de script.\\
 +Ce guide détaille toutes les méthodes qui peuvent être utilisées pour trouver des erreurs dans les scripts bash.\\
 +Donc, chaque fois que vous sentez que votre script bash ne fonctionne pas comme prévu, utilisez l'une des méthodes mentionnées ci-dessus, mais dans la plupart des cas, le mode xtrace (-x) est très utile.
 ===== Problèmes connus ===== ===== Problèmes connus =====