Table des matières

, , ,

Débogage de scripts shell

Avant toute exécution, on peut vouloir valider la syntaxe d'un fichier de script. Pour cela on peut invoquer un shell avec l'option -n (noexec) et le scrit à vérifier en paramètre:

bash -n monscript.sh

Le shell Bash peut être invoqué avec l'option -x pour activer le mode trace/debug. Les commandes sont affichées sur la sortie standard avant exécution préfixées par le caractère '+'.

Dans l'exemple ci-dessous le script utilise en première ligne le shabang pour spécifier l'interpréteur à utiliser (bash) avec l'option -x (xtrace) ainsi les commandes présentes dans le script seront affichées avant exécution.

#!/bin/bash -x
# Les commandes présentes dans ce script sont affichées
# Le shell est invoqué avec l'option xtrace

A tout moment dans un script on peut activer/désactiver l'option via la commande interne set:

# Activer l'affichage des commandes avant exécution
set -x
 
# équivalent
set -o xtrace
 
# désactiver l'affichage des commandes avant exécution
set +x
 
# équivalent
set +o xtrace

Ci-dessous quelques options couramment utilisées pour le développement et le débogage:

Notation courte Notation longue Résultat
set -e set -o errexit Interruption immédiate lorsqu'un code de retour est différent de 0.
set -f set -o noglob Désactive la génération des noms via les méta-caractères (globbing).
set -v set -o verbose Affiche les lignes lues avant interprétation.
set -x set -o xtrace Affiche la commande avant execution.
set -u set -o nounset Utilisation d'une variable non définie provoque une erreur.
set -n set -o noexec Valider la syntaxe d'un fichier script sans executer les commandes.

Pour afficher les options activées par les arguments positionnels:

echo $-

bashdb

Il existe un débogueur dont la syntaxe est proche de gdb: bashdb. Il s'appuie sur une option de Bash (extdebug).

Sur les versions récentes d'Ubuntu le programme n'est plus intégré au gestionnaire de paquets. Il faudra l'installer à partir des sources, voir https://sourceforge.net/p/bashdb/code/ci/bash-5.1/tree/INSTALL

Références

https://tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_03.html