{{tag>dev shell bash debug}}
====== 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