Différences
Ci-dessous, les différences entre deux révisions de la page.
tutoriel:programmation:deboguage:bash:start [2022/06/04 17:36] – [Comment déboguer un script bash avec l'option noexec -n] admin | tutoriel: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' | S'il n'y a pas d' | ||
- | Changeons maintenant notre code : | + | Changeons maintenant notre code :<code - b_script.sh> |
+ | #! /bin/bash | ||
+ | echo "Enter number1" | ||
+ | read number1 | ||
+ | echo "Enter number2" | ||
+ | read number2 | ||
+ | if [ " | ||
+ | then | ||
+ | echo " | ||
+ | elif [ " | ||
+ | #then | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | </ | ||
+ | |||
+ | Je commente le **then** après **elif**. | ||
+ | |||
+ | Maintenant exécutez le script **b_script.sh** avec **-n** :<cli prompt=' | ||
+ | / | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | Comme prévu, il a clairement identifié l' | ||
==== 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' | ||
+ | |||
+ | Souvent, vous entrez par erreur une variable, ce qui empêche l' | ||
+ | |||
+ | Pour détecter une telle erreur, nous utilisons l' | ||
+ | |||
+ | Changeons à nouveau le code :< | ||
+ | #! /bin/bash | ||
+ | echo "Enter number1" | ||
+ | read number1 | ||
+ | echo "Enter number2" | ||
+ | read number2 | ||
+ | if [ " | ||
+ | then | ||
+ | echo " | ||
+ | elif [ " | ||
+ | then | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi</ | ||
+ | |||
+ | Tout d' | ||
+ | |||
+ | Maintenant **num1** est une variable non définie. | ||
+ | |||
+ | Exécutons maintenant le script :< | ||
+ | Enter number1 | ||
+ | 4 | ||
+ | Enter number2 | ||
+ | 6 | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | 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' | + | 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' | ||
+ | |||
+ | Heureusement, | ||
+ | |||
+ | 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 [ " | ||
+ | then | ||
+ | echo " | ||
+ | elif [ " | ||
+ | then | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi | ||
+ | set +x</ | ||
+ | |||
+ | Maintenant lancez le script :<cli prompt=' | ||
+ | Enter number1 | ||
+ | 7 | ||
+ | Enter number2 | ||
+ | 3 | ||
+ | + ' | ||
+ | + echo ' | ||
+ | Number1 greater than number2 | ||
+ | + set +x | ||
+ | </ | ||
+ | |||
+ | 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' | ||
+ | |||
+ | La commande **trap** capte les signaux et exécute la commande lorsqu' | ||
+ | |||
+ | 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"</ | ||
+ | |||
+ | La commande **trap** avec le signal **DEBUG** affiche l' | ||
+ | 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</ | ||
+ | |||
+ | Lignes 3, 4, 5, 6 et 7, les espaces après le mot " | ||
+ | |||
+ | 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' | ==== Comment déboguer un script bash sans substitution de fichier à l'aide de l' | ||
+ | La substitution de fichiers est le processus de recherche de fichiers avec des caractères génériques, | ||
+ | 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' | ||
+ | |||
+ | Voyons le script :<code bash fglobe_script.sh> | ||
+ | #! /bin/bash | ||
+ | |||
+ | echo " | ||
+ | ls *.txt</ | ||
+ | |||
+ | Le code ci-dessus affichera tous les fichiers texte du répertoire courant :<cli prompt=' | ||
+ | Display all text files | ||
+ | Doc1.txt | ||
+ | |||
+ | Pour désactiver la substitution de fichiers, utilisez l' | ||
+ | Display all text files | ||
+ | ls: impossible d' | ||
+ | |||
+ | De même, vous pouvez l' | ||
+ | |||
+ | set -f | ||
+ | echo " | ||
+ | ls *.txt | ||
+ | set +f</ | ||
+ | |||
+ | Exécutez maintenant bash fglobe_script.sh :< | ||
+ | Display all text files | ||
+ | Doc1.txt | ||
+ | Display all text files | ||
+ | ls: impossible d' | ||
==== 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' | ||
+ | |||
+ | Implémentons les variantes **-x** et **-v** du script **sum_script.sh**. J' | ||
+ | #! /bin/bash | ||
+ | echo "Enter first number" | ||
+ | read number1 | ||
+ | echo "Enter second number" | ||
+ | read number2 | ||
+ | sum=$[number1 + number2] | ||
+ | echo "The sum is $sum"</ | ||
+ | |||
+ | Maintenant, lancez :< | ||
+ | #! /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</ | ||
+ | |||
+ | Les sorties **-x** et **-v** sont combinées comme indiqué dans l' | ||
+ | |||
+ | De même, nous pouvons combiner l' | ||
+ | |||
+ | Je remplace la variable number1 par num sur la sixième ligne du script :< | ||
+ | #! /bin/bash | ||
+ | echo "Enter first number" | ||
+ | read number1 | ||
+ | echo "Enter second number" | ||
+ | read number2 | ||
+ | sum=$[num + number2] | ||
+ | echo "The sum is $sum"</ | ||
+ | |||
+ | Pour afficher le résultat, exécutez la commande suivante :< | ||
+ | #! /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: | ||
==== Comment rediriger le rapport de débogage vers un fichier ==== | ==== Comment rediriger le rapport de débogage vers un fichier ==== | ||
+ | L' | ||
+ | |||
+ | 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 :< | ||
+ | #! /bin/bash | ||
+ | exec 5> debug_report.log | ||
+ | PS4=' | ||
+ | BASH_XTRACEFD=" | ||
+ | echo "Enter number1" | ||
+ | read number1 | ||
+ | echo "Enter number2" | ||
+ | read number2 | ||
+ | if [ " | ||
+ | then | ||
+ | echo " | ||
+ | elif [ " | ||
+ | then | ||
+ | echo " | ||
+ | else | ||
+ | echo " | ||
+ | fi</ | ||
+ | |||
+ | 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=' | ||
+ | |||
+ | Le script ci-dessus crée un fichier journal nommé debug_report.log, | ||
+ | + exec | ||
+ | + PS4=' | ||
+ | 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-- ' | ||
+ | 12-- ' | ||
+ | 16-- echo ' | ||
+ | </ | ||
===== Pré-requis ===== | ===== Pré-requis ===== | ||
Ligne 250: | Ligne 515: | ||
===== Conclusion ===== | ===== Conclusion ===== | ||
+ | Un code plein d' | ||
+ | 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' | ||
+ | |||
+ | 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 ===== | ||