Retour au cours

debugging

Objectifs

  • Tracer l’exécution d’un script en temps réel avec set -x.
  • Personnaliser la sortie de débogage pour y ajouter des informations de contexte (nom du fichier, numéro de ligne).
  • Analyser statiquement votre code pour trouver des erreurs courantes et des mauvaises pratiques avec shellcheck.
  • Formatter automatiquement votre code pour le rendre plus lisible avec shfmt.

Explications détaillées

Notions clés

Déboguer un script shell peut être frustrant. Heureusement, des outils puissants existent pour vous faciliter la vie.

set -x : Voir ce que le shell exécute

set -x (ou set -o xtrace) est un mode de débogage intégré à Bash. Lorsqu’il est activé, le shell affiche chaque commande juste avant de l’exécuter, après avoir effectué toutes les expansions (remplacement des variables, etc.). C’est le meilleur moyen de voir exactement ce que votre script fait.

On le désactive avec set +x. On peut aussi lancer un script entier en mode debug avec bash -x mon_script.sh.

PS4 : Personnaliser la sortie de set -x

Par défaut, set -x préfixe chaque ligne de + . Vous pouvez personnaliser ce préfixe en modifiant la variable PS4 pour y ajouter des informations utiles.

Une configuration PS4 très pratique est : export PS4='+ ${BASH_SOURCE}:${LINENO}: ${FUNCNAME[0]:+${FUNCNAME[0]}()}: '

  • + : Le préfixe de base.
  • ${BASH_SOURCE} : Le nom du fichier en cours d’exécution.
  • ${LINENO} : Le numéro de la ligne.
  • ${FUNCNAME[0]} : Le nom de la fonction en cours.

shellcheck : Le correcteur orthographique de votre script

shellcheck est un outil d’analyse statique (un “linter”) qui détecte des centaines d’erreurs courantes, de bugs potentiels et de mauvaises pratiques dans vos scripts, sans même avoir à les exécuter.

C’est l’outil le plus important à adopter pour améliorer la qualité de vos scripts. Installez-le et utilisez-le systématiquement.

shfmt : Le formateur de code automatique

shfmt est un outil qui reformate automatiquement votre code pour qu’il suive un style cohérent et lisible (indentation, espacement, etc.). Il vous évite d’avoir à vous soucier de la mise en forme.

Syntaxe / Usages

# Lancer un script entier en mode debug
bash -x ./mon_script.sh

# Activer et désactiver le debug dans une section d'un script
echo "Début d'une section complexe..."
set -x
# ... code à tracer ...
set +x
echo "Fin de la section complexe."

# Analyser un script avec shellcheck
shellcheck mon_script.sh

# Formatter un script en place
shfmt -w mon_script.sh

Exemples

# 1. Utilisation de set -x
#!/usr/bin/env bash
set -eu

USER="admin"
# On active le mode xtrace
set -x

if [[ "$USER" == "admin" ]]; then
  echo "Accès autorisé."
fi

# On le désactive
set +x
echo "Fin."

# Sortie du script :
# + [[ admin == \a\d\m\i\n ]]
# + echo 'Accès autorisé.'
# Accès autorisé.
# + set +x
# Fin.
# On voit exactement la commande de test qui a été exécutée.

# 2. Utilisation de shellcheck
# Script avec une erreur classique :
# #!/bin/bash
# for f in $(ls *.txt); do
#   echo "$f"
# done
# 
# shellcheck va immédiatement vous avertir :
# SC2045: Iterating over ls output is fragile. Use globs.
# SC2086: Double quote to prevent globbing and word splitting.

Bonnes pratiques

  • Intégrez shellcheck à votre éditeur de code (via une extension) pour avoir des retours en temps réel pendant que vous écrivez.
  • Ajoutez shellcheck et shfmt à votre CI/CD. Cela garantit que tout le code qui arrive sur la branche principale respecte un standard de qualité et de formatage.
  • Utilisez set -x localement pour débugger des sections spécifiques, mais ne le laissez pas en production, car il peut être très verbeux et potentiellement afficher des informations sensibles.

Pièges courants

  • Affichage de secrets avec set -x : Si une commande utilise une variable contenant un mot de passe, set -x l’affichera en clair dans les logs. Soyez extrêmement prudent.
  • Ignorer les avertissements de shellcheck : shellcheck est le fruit de l’analyse de milliers de scripts. Ses suggestions sont presque toujours pertinentes. Les ignorer, c’est prendre le risque d’introduire des bugs subtils.

Exercices

  1. Tracer un script :

    • Prenez un des scripts que vous avez écrits dans les leçons précédentes.
    • Lancez-le avec bash -x et observez la sortie. Essayez de comprendre chaque ligne affichée.
    • Ajoutez set -x et set +x pour ne tracer qu’une petite partie du script.
  2. Corriger avec shellcheck :

    • Installez shellcheck sur votre machine (via votre gestionnaire de paquets, ex: sudo apt install shellcheck).
    • Écrivez volontairement un script avec des erreurs courantes (une variable non citée, une boucle sur ls).
    • Lancez shellcheck dessus et corrigez les problèmes qu’il signale.
  3. Formatter avec shfmt :

    • Installez shfmt.
    • Écrivez un script avec une indentation et un espacement incohérents.
    • Utilisez shfmt -w mon_script.sh pour le reformater automatiquement.