Site icon

Bash -x sous Linux : Guide complet pour déboguer vos scripts

Le bash -x linux est l’outil de débogage le plus rapide pour traquer les erreurs dans un script shell. Que tu gères des serveurs en production ou que tu automatises des tâches avec des scripts Bash, comprendre l’option -x te fera gagner un temps précieux. Ce guide te montre comment l’utiliser efficacement, avec des exemples concrets et des alternatives complémentaires.

Qu’est-ce que bash -x sous Linux ?

L’option -x de Bash active le mode xtrace (extended trace). Quand tu lances un script avec bash -x, le shell affiche chaque commande qu’il s’apprête à exécuter, après expansion des variables et des substitutions. Résultat : tu vois exactement ce que Bash exécute, ligne par ligne.

C’est indispensable pour identifier :

Comment utiliser bash -x

Méthode 1 : en ligne de commande

La méthode la plus directe :

bash -x monscript.sh

Tu peux aussi passer des arguments au script :

bash -x deploy.sh --env prod --verbose

Méthode 2 : dans le shebang

Ajoute -x directement dans l’en-tête de ton script :

#!/bin/bash -x
echo "Début du déploiement"
ENV=$1
if [ -z "$ENV" ]; then
    echo "Erreur : environnement manquant"
    exit 1
fi
echo "Environnement : $ENV"

Avec cette méthode, le script produit toujours une trace. À réserver pour le développement, pas pour la production.

Méthode 3 : avec set -x / set +x

Active la trace uniquement sur la section qui pose problème :

#!/bin/bash

# Début normal (pas de trace)
CONFIG_FILE="/etc/app/config.yml"

# Activer la trace pour le bloc sensible
set -x
source "$CONFIG_FILE"
set +x

# Suite du script sans trace
echo "Configuration chargée"

C’est la méthode la plus propre en production : tu ne pollues pas les logs avec des dizaines de lignes inutiles.

Comment lire la sortie de bash -x

Chaque ligne tracée est préfixée par +. Un + supplémentaire indique un niveau d’imbrication (fonction, sous-shell). Voici un exemple :

#!/bin/bash -x

SERVERS=("web1" "web2" "web3")
for s in "${SERVERS[@]}"; do
    echo "Vérification de $s"
done

Sortie :

+ SERVERS=(web1 web2 web3)
+ for s in '${SERVERS[@]}'
+ echo 'Vérification de web1'
Vérification de web1
+ for s in '${SERVERS[@]}'
+ echo 'Vérification de web2'
Vérification de web2
+ for s in '${SERVERS[@]}'
+ echo 'Vérification de web3'
Vérification de web3

Les lignes avec + sont les commandes telles que Bash les interprète. Les lignes sans + sont la sortie réelle du script.

💡 Astuce : Si la trace est trop verbeuse, redirige-la dans un fichier pour l’analyser à tête reposée :
bash -x monscript.sh 2>trace.log

Déboguer une portion spécifique d’un script

Pour les scripts longs, utiliser bash -x sur tout le fichier génère une trace massive. Utilise set -x / set +x pour cibler le bloc problématique :

#!/bin/bash

BACKUP_DIR="/backup"
DATE=$(date +%F)

# Zone à déboguer
set -x
tar -czf "$BACKUP_DIR/data-$DATE.tar.gz" /data/app
cp "$BACKUP_DIR/data-$DATE.tar.gz" /mnt/nas/
set +x

echo "Sauvegarde terminée"

Tu peux aussi combiner avec PS4 pour enrichir la trace :

export PS4='+ ${BASH_SOURCE}:${LINENO}: '
bash -x monscript.sh

Avec ce PS4, chaque ligne tracée affiche le fichier source et le numéro de ligne, ce qui facilite la localisation dans les gros scripts.

Alternatives : les autres options de débogage Bash

Le mode bash -x linux n’est qu’une des options disponibles. Voici les compléments utiles :

Option Effet Usage
-x Trace des commandes exécutées Voir ce que Bash exécute réellement
-v Affiche chaque ligne lue Vérifier la logique avant expansion
-n Vérifie la syntaxe sans exécuter Validation avant déploiement
-e Stop à la première erreur Scripts robustes en production
-u Erreur si variable non définie Détecter les typos de variables

Combiner ces options est une bonne pratique :

#!/bin/bash
set -euo pipefail
set -x

-euo pipefail rend le script strict (erreurs fatales, variables non définies interdites, échec sur pipe). Ajoute -x uniquement le temps du débogage.

Bonnes pratiques pour le débogage Bash

  1. Ne laisse jamais -x en production. La trace pollue les logs et peut exposer des données sensibles (mots de passe dans les variables).
  2. Utilise set -x / set +x plutôt que l’option globale pour cibler les zones critiques.
  3. Personnalise PS4 pour obtenir le numéro de ligne et le contexte dans les gros scripts.
  4. Combine avec -n pour vérifier la syntaxe avant même d’exécuter : bash -n monscript.sh.
  5. Redirige la trace dans un fichier si elle est longue : bash -x script.sh 2>debug.log.

Pour aller plus loin avec les scripts Bash, consulte notre introduction au langage Bash qui couvre les bases du shell et les bonnes pratiques de scripting.

FAQ

Q : Quelle est la différence entre bash -x et bash -v ?

bash -x affiche chaque commande après expansion des variables (ce que Bash exécute réellement). bash -v affiche chaque ligne avant expansion (ce qui est écrit dans le fichier). Utilise -v pour vérifier la logique de lecture, -x pour voir l’exécution effective.

Q : Comment déboguer un script qui tourne déjà en production ?

Tu ne peux pas ajouter -x à un processus en cours. La solution est de reproduire le problème localement avec bash -x, ou d’ajouter temporairement set -x dans le script, le relancer, puis le retirer. Pour un diagnostic sans modification, utilise strace -p PID pour tracer les appels système du processus.

Q : Est-ce que bash -x ralentit l’exécution du script ?

Oui, légèrement. L’affichage de chaque commande sur stderr ajoute un overhead I/O. Pour un script court, c’est négligeable. Pour un traitement long (boucle de milliers d’itérations), cela peut ralentir significativement. Dans ce cas, redirige la trace vers /dev/null si tu n’en as pas besoin immédiatement, ou utilise set -x uniquement sur le bloc problématique.

Q : Peut-on utiliser bash -x avec un script exécuté via cron ?

Oui. Modifie l’entrée crontab pour utiliser bash -x : 0 * * * * /bin/bash -x /chemin/script.sh >> /var/log/debug.log 2>&1. Attention : les traces peuvent être volumineuses, surveille l’espace disque.

Conclusion

bash -x est l’outil de débogage par excellence pour les scripts Bash. Simple à utiliser, immédiat et sans dépendance, il permet de traquer rapidement la plupart des erreurs courantes. Combine-le avec set -euo pipefail pour des scripts robustes, et n’oublie pas de désactiver la trace avant la mise en production.

Quitter la version mobile