<Précédent | Table des matières | Suivant>
Traçant
Les bogues sont souvent des cas de flux logique inattendu dans un script. C'est-à-dire que des parties du script ne sont jamais exécutées ou sont exécutées dans le mauvais ordre ou au mauvais moment. Pour visualiser le déroulement réel du programme, nous utilisons une technique appelée traçant.
Une méthode de traçage consiste à placer des messages informatifs dans un script qui affiche le lieu d'exécution. Nous pouvons ajouter des messages à notre fragment de code :
echo "préparation à la suppression de fichiers" >&2
if [[ -d $dir_name ]] ; alors si cd $dir_name; alors
echo "suppression de fichiers" >&2
rm *
d'autre
echo "Impossible d'accéder à '$dir_name'" >&2 exit 1
fi d'autre
echo "aucun répertoire de ce type : '$dir_name'" >&2 exit 1
fi
echo "suppression de fichier terminée" >&2
echo "préparation à la suppression de fichiers" >&2
if [[ -d $dir_name ]] ; alors si cd $dir_name; alors
echo "suppression de fichiers" >&2
rm *
d'autre
echo "Impossible d'accéder à '$dir_name'" >&2 exit 1
fi d'autre
echo "aucun répertoire de ce type : '$dir_name'" >&2 exit 1
fi
echo "suppression de fichier terminée" >&2
Nous envoyons les messages à l'erreur standard pour les séparer de la sortie normale. Nous n'indentons pas non plus les lignes contenant les messages, il est donc plus facile de trouver quand il est temps de les supprimer.
Maintenant, lorsque le script est exécuté, il est possible de voir que la suppression du fichier a été effectuée :
[me@linuxbox ~]$ delete-script se prépare à supprimer des fichiers en supprimant des fichiers
suppression du fichier terminée [me@linuxbox ~]$
[me@linuxbox ~]$ delete-script se prépare à supprimer des fichiers en supprimant des fichiers
suppression du fichier terminée [me@linuxbox ~]$
bash fournit également une méthode de traçage, implémentée par l'option -x et la commande set avec l'option -x. En utilisant notre script de problème précédent, nous pouvons activer le traçage pour l'ensemble du script en ajoutant l'option -x à la première ligne :
#!/bin/bash-x
#!/bin/bash-x
Débogage
# problème : script pour démontrer les erreurs courantes number=1
if [ $nombre = 1 ] ; alors
echo "Le nombre est égal à 1." autre
echo "Le nombre n'est pas égal à 1."
fi
# problème : script pour démontrer les erreurs courantes number=1
if [ $nombre = 1 ] ; alors
echo "Le nombre est égal à 1." autre
echo "Le nombre n'est pas égal à 1."
fi
Une fois exécuté, les résultats ressemblent à ceci :
[moi@linuxbox ~]$ difficulté
+ nombre=1
+ '[' 1 = 1 ']'
+ echo 'Le nombre est égal à 1.' Le nombre est égal à 1.
[moi@linuxbox ~]$ difficulté
+ nombre=1
+ '[' 1 = 1 ']'
+ echo 'Le nombre est égal à 1.' Le nombre est égal à 1.
Avec le traçage activé, nous voyons les commandes exécutées avec les extensions appliquées. Les signes plus de tête indiquent l'affichage de la trace pour les distinguer des lignes de sortie régulières. Le signe plus est le caractère par défaut pour la sortie de trace. Il est contenu dans le PS4 (chaîne d'invite 4) variable shell. Le contenu de cette variable peut être ajusté pour rendre l'invite plus utile. Ici, nous modifions le contenu de la variable pour inclure le numéro de ligne actuel dans le script où la trace est effectuée. Notez que les guillemets simples sont nécessaires pour empêcher l'expansion jusqu'à ce que l'invite soit réellement utilisée :
[moi@linuxbox ~]$ export PS4='$LINENO + '
[moi@linuxbox ~]$ difficulté
5 + nombre=1
7 + '[' 1 = 1 ']'
8 + echo 'Le nombre est égal à 1.' Le nombre est égal à 1.
[moi@linuxbox ~]$ export PS4='$LINENO + '
[moi@linuxbox ~]$ difficulté
5 + nombre=1
7 + '[' 1 = 1 ']'
8 + echo 'Le nombre est égal à 1.' Le nombre est égal à 1.
Pour effectuer une trace sur une partie sélectionnée d'un script, plutôt que sur le script entier, nous pouvons utiliser le set commande avec le -x option:
#! / Bin / bash
# problème : script pour démontrer les erreurs courantes number=1
#! / Bin / bash
# problème : script pour démontrer les erreurs courantes number=1
set -x # Activer le traçage
if [ $nombre = 1 ] ; alors
echo "Le nombre est égal à 1." autre
echo "Le nombre n'est pas égal à 1."
fi
set +x # Désactiver le traçage
set -x # Activer le traçage
if [ $nombre = 1 ] ; alors
echo "Le nombre est égal à 1." autre
echo "Le nombre n'est pas égal à 1."
fi
set +x # Désactiver le traçage
Nous utilisons les set commande avec le -x option pour activer le traçage et le +x option pour désactiver le traçage. Cette technique peut être utilisée pour examiner plusieurs parties d'un script problématique.