Scripts Bash fiables
Progression
#Écrire des scripts Bash fiables
Un “bon” script Bash est prévisible, explicite et échoue tôt en cas de problème. Commencez par un shebang et des options qui durcissent le comportement:
1#!/usr/bin/env bash2set -Eeuo pipefail3IFS=$'\n\t'
-e
arrête le script si une commande échoue.-u
échoue si une variable non définie est utilisée.-o pipefail
propage les erreurs à travers les pipes.
Le piège classique: l’expansion hasardeuse des variables. En règle générale, entourez vos variables de guillemets: "$var"
. Cela évite les surprises dues aux espaces et au “globbing”.
La lisibilité se gagne aussi avec des fonctions courtes et des noms explicites. Préférez des case
aux enchaînements de if
fragiles, et regroupez les sorties dans une fonction die()
qui affiche un message sur stderr
puis quitte avec un code non nul. Pour le débogage ponctuel, set -x
affiche les commandes exécutées; pensez à le couper une fois le problème résolu.
Gabarit de script commenté:
1#!/usr/bin/env bash2set -Eeuo pipefail3IFS=$'\n\t'4 5usage() { echo "Usage: $0 -f <fichier>"; }6 7file=""8while getopts ":f:h" opt; do9 case "$opt" in10 f) file="$OPTARG" ;;11 h) usage; exit 0 ;;12 *) usage; exit 2 ;;13 esac14done
Organisez vos scripts: un dossier bin/
pour les exécutables, un logs/
si vous écrivez des fichiers de traces, et des variables d’environnement chargées depuis un .env
(à ne pas committer s’il contient des secrets).
Les fichiers temporaires doivent être uniques et nettoyés. Utilisez mktemp
pour éviter les collisions et installez un trap
sur EXIT
pour supprimer les artefacts. Quand un script manipule des chemins avec des espaces, double‑citez systématiquement et parcourez les fichiers avec find -print0 | xargs -0
pour rester robuste.
#Animation: garde‑fous d’un script
#Mini‑exercice (robustesse)
Écrivez un script qui:
- Crée un dossier temporaire via
mktemp -d
et le supprime avectrap 'rm -rf "$TMP"' EXIT
. - Télécharge un fichier (simulez par
echo
si sans réseau) et vérifie son empreinte (simulez avecsha256sum
). - Gère proprement l’interruption (Ctrl+C): affiche « annulé » et nettoie.
Vérifiez qu’un échec dans un pipe est bien remonté grâce à set -o pipefail
.