Gestion-Erreurs-bash
Gestion-Erreurs-bash

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

ConceptExemple 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

ConceptExemple 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

ConceptExemple 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, &>

ConceptExemple 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

ConceptExemple 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”

ConceptExemple 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

CasAnalyse / 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 inexistantgrep() 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 :


🏁 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

Gestion-Erreurs-bash

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
}

Leave a Comment

Comments

No comments yet. Why don’t you start the discussion?

    Alors tu en pense quoi de cette article ? Dis-moi tous..