Aller au contenu principal

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:

bashbash
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é:

bashbash
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

Options
set -Eeuo pipefail ; IFS strict
Quoting
Toujours "$var" ; globs maîtrisés
Trap
trap sur EXIT/ERR/INT pour cleanup
Temp
mktemp et dossiers uniques
Erreurs
die(), codes explicites

#Mini‑exercice (robustesse)

Écrivez un script qui:

  1. Crée un dossier temporaire via mktemp -d et le supprime avec trap 'rm -rf "$TMP"' EXIT.
  2. Télécharge un fichier (simulez par echo si sans réseau) et vérifie son empreinte (simulez avec sha256sum).
  3. 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.