Introduction : Pourquoi lâerreur est la norme en prod ?
Un script Bash qui ne gÚre pas ses erreurs est une bombe à retardement. En production, un simple rm mal dirigé ou une variable vide peut faire tomber un service entier.
Ce projet tâapprend Ă maĂźtriser la gestion des erreurs Bash, du set -e au trap ERR, en passant par les redirections stderr, et Ă transformer ton terminal en vĂ©ritable tableau de bord de debug.
Codes de retour & propagation des erreurs
| Concept | Exemple concret / code |
|---|---|
Chaque commande Bash renvoie un code de sortie (exit code) : 0 = succĂšs, â 0 = Ă©chec. Il est disponible via la variable spĂ©ciale $?. | bash echo "Test" echo $? # 0 ls /dossier/inexistant echo $? # 2 |
| PIPESTATUS capture les codes dâun pipeline complet. | « `bash cat fichier.txt |
exit termine un script avec un code prĂ©cis ; return fait de mĂȘme dans une fonction. | « `bash function check() { [ -f « $1 » ] |
Mode strict : set -e, set -u, set -o pipefail
| Concept | Exemple concret / code |
|---|---|
set -e â arrĂȘt immĂ©diat en cas dâerreur (âfail fastâ). | bash set -e mkdir /data cd /data ls /inexistant echo "jamais affichĂ©" |
set -u â dĂ©tecte lâutilisation de variables non dĂ©finies. | bash set -u echo $VAR_NON_EXISTANTE # â erreur immĂ©diate |
set -o pipefail â le code dâerreur du pipeline reflĂšte la premiĂšre commande Ă©chouĂ©e. | « `bash set -o pipefail cat inexistant |
| Combiner les trois = script quasi hermétique. | bash set -euo pipefail IFS=$'\n\t' |
trap : capturer, enrichir, nettoyer
| Concept | Exemple concret / code |
|---|---|
trap intercepte un signal ou un événement. Idéal pour nettoyer avant sortie. | bash trap 'echo "Interruption capturée" ; exit 1' INT |
| Le signal ERR permet de gérer toute erreur. | bash trap 'echo "Erreur sur $BASH_COMMAND (ligne $LINENO)"' ERR |
EXIT sâexĂ©cute toujours Ă la fin (succĂšs ou non). | bash trap 'echo "Fin du script : code $?"' EXIT |
Pour hériter du trap dans les fonctions, active set -E. | bash set -E trap 'echo "Erreur dans $FUNCNAME"' ERR |
Redirections dâerreur : 2>, 2>&1, &>
| Concept | Exemple concret / code |
|---|---|
stdout = flux normal ; stderr = flux dâerreurs. | cmd >out.log 2>err.log |
Rediriger les deux flux ensemble : &> (Bash >= 4). | cmd &>tout.log |
Attention Ă lâordre : >fichier 2>&1 â 2>&1 >fichier. | Premier capture stdout + stderr, second redirige seulement stdout. |
Logger proprement : tee affiche et écrit. | « `bash mycmd 2>&1 |
Outils de debug intégrés
| Concept | Exemple concret / code |
|---|---|
set -x : affiche chaque commande avant exécution. | bash set -x echo "debug" set +x |
| Personnaliser lâaffichage avec PS4. | bash PS4='+ ${BASH_SOURCE}:${LINENO}: ' ; set -x |
Envoyer la trace dans un fichier : BASH_XTRACEFD. | bash exec 5>debug.log ; BASH_XTRACEFD=5 ; set -x |
| Lancer un script complet en mode debug. | bash -x script.sh |
Bonnes pratiques âprod-readyâ
| Concept | Exemple concret / code |
|---|---|
| Activer le mode strict et un IFS sécurisé. | bash set -euo pipefail ; IFS=$'\n\t' |
Fonctions de sortie contrÎlée : die() et try(). | « `bash die() { echo « Erreur : $* » >&2 ; exit 1 ;} try() { « $@ » |
| Nettoyage automatique avec trap. | bash tmp=$(mktemp) ; trap 'rm -f "$tmp"' EXIT |
Outils QA : shellcheck et bats. | Vérifie syntaxe et tests unitaires de scripts Bash. |
Cas réels : mini post-mortems
| Cas | Analyse / correction |
|---|---|
| Un pipeline silencieux ne renvoyait pas dâerreur. | Solution : set -o pipefail et echo ${PIPESTATUS[*]}. |
| Script cron échouait car variable non chargée. | Ajouter source /etc/profile et set -u pour détection immédiate. |
| Fichiers temporaires non supprimĂ©s aprĂšs CTRL-C. | trap INT EXIT 'cleanup' assure la suppression mĂȘme en interruption. |
đŹ Retour dâexpĂ©rience du lecteur
Avez-vous déjà vu un script planter silencieusement ?
Racontez vos mésaventures : quelles stratégies ou outils vous ont permis de déboguer plus vite ?
đ§© Atelier pratique â Grille 2Ă2 dâexercices
| đ§ Exercice 1 | đ§ Exercice 2 |
|---|---|
| Un pipeline (`cat inexistant | grep() masque lâerreur : corrige avec pipefailet vĂ©rifie PIPESTATUS`. |
| âïž Exercice 3 | đ§Ș Exercice 4 |
Active PS4 et BASH_XTRACEFD pour rediriger le debug vers un fichier. | Ăcris un wrapper run() avec retry + backoff + timeout simulĂ©s. |
đ Recommandations / Autres solutions
đ§ Pour aller plus loin avant ou aprĂšs ce projet :
Avant de plonger dans les tableaux et structures, jette un Ćil Ă ces articles complĂ©mentaires :
- đ§ Bases du scripting Bash â comprendre le shebang, les variables et la structure dâun script.
- âïž Variables et opĂ©rateurs en Bash â tout sur les variables spĂ©ciales, dâenvironnement et les opĂ©rateurs.
- đ Boucles et conditions en Bash â la logique rĂ©pĂ©titive : for, while, if, case.
- đ§© Tableaux, dictionnaires – structures avancĂ©es en Bash – Part 4
đ Conclusion
La gestion des erreurs Bash nâest pas quâune formalitĂ© : câest le gilet pare-balles de tout script en production.
MaĂźtriser set -euo pipefail, trap ERR, et les redirections rend tes automatismes plus fiables et ton diagnostic plus rapide.
Prochaine Ă©tape : intĂ©grer ces pratiques dans ton pipeline CI/CD et partager tes templates dâerreur au sein de ton Ă©quipe.
Et toi, comment gĂšres-tu tes erreurs ? Partage ton approche en commentaire !
đ§© Solutions des exercices

Exercice 1
set -o pipefail
cat inexistant | grep txt
echo "${PIPESTATUS[@]}"
Exercice 2
trap 'echo "$(date) | $BASH_SOURCE:$LINENO | $BASH_COMMAND" >> /tmp/errors.log' ERR
Exercice 3
exec 5>trace.log
PS4='+${BASH_SOURCE}:${LINENO}: '
BASH_XTRACEFD=5
set -x
# commands...
set +x
Exercice 4
run() {
local retries=3 delay=2
for ((i=1;i<=retries;i++)); do
"$@" && return 0
echo "Tentative $i échouée, nouvelle dans ${delay}s..."
sleep $delay
((delay*=2))
done
echo "Ăchec dĂ©finitif : $*"
return 1
}
