Linux — utilisation avancée et administration · Étape 24

Automatise avec un script Bash robuste

Transforme un pipeline en script testable avec contrat d’entrée, codes de sortie, fichier temporaire, traps et remplacement atomique.

Durée indicative · ~1 h 50Niveau intermédiairePrérequis conseillé · Leçon 23 — cut, sort, uniq et awkPratique · TP
L’idée reçue

« Ajouter set -e rend automatiquement un script fiable. »

Le mode strict révèle certaines erreurs, mais il ne définit ni contrat d’entrée, ni rollback, ni tests. Sa sémantique doit être comprise dans les conditions, pipelines, sous-shells et commandes dont l’échec est attendu.

01Lis le starter et le contrat

export LAB="/tmp/soria-linux-text-$USER"
sed -n '1,120p' "$LAB/bin/report-starter.sh"
printf '%s\n' \
  'input: access.log lisible' \
  'output: rapport complet ou fichier précédent intact' \
  'stdout: confirmation' \
  'stderr: diagnostic' \
  'status 0: succès' \
  'status 2: usage incorrect' \
  'status 3: entrée illisible'

Avant le code, le script possède un contrat. Celui-ci permet d’écrire les tests et d’éviter qu’une erreur partielle remplace un rapport valide.

02Active les contrôles Bash

sed -n '1,45p' "$LAB/bin/report-reference.sh"
Option
Effet
Limite
-e
sortir sur de nombreux échecs non gérés
exceptions dans conditions et listes
-u
refuser une variable non définie
valeurs optionnelles à traiter explicitement
pipefail
propager un échec dans un pipeline
un échec attendu doit être capturé
-E
hériter du trap ERR
ne remplace pas des messages métier

03Valide les arguments et l’entrée

grep -nE 'usage|#|input=|output=|readable file|exit [0-9]' \
  "$LAB/bin/report-reference.sh"

Le nombre d’arguments est contrôlé avant leur utilisation. L’entrée doit être un fichier régulier et lisible. Les messages d’erreur vont sur stderr.

04Écris par fichier temporaire

grep -nE 'output_dir|mktemp|tmp_file|mv ' \
  "$LAB/bin/report-reference.sh"

Le rapport est d’abord écrit dans le même répertoire que la destination. mv ne remplace la destination qu’après réussite de l’agrégation.

Écrire directement dans la destination peut la tronquer avant qu’une commande suivante échoue. Le temporary file protège la dernière version valide.

05Nettoie avec un trap

grep -nE 'cleanup|on_error|trap ' \
  "$LAB/bin/report-reference.sh"

Le trap EXIT supprime le fichier temporaire encore présent. Le trap ERR ajoute la ligne et le code de sortie au diagnostic. Le nettoyage doit être idempotent.

06Exécute le script de référence

"$LAB/bin/report-reference.sh" \
  "$LAB/data/access.log" \
  "$LAB/reports/manual-report.txt"
cat "$LAB/reports/manual-report.txt"
diff -u "$LAB/expected/report.txt" \
  "$LAB/reports/manual-report.txt"

07Teste les chemins d’erreur

set +e
"$LAB/bin/report-reference.sh"
usage_rc=$?
"$LAB/bin/report-reference.sh" \
  "$LAB/data/missing.log" \
  "$LAB/reports/should-not-exist.txt"
missing_rc=$?
set -e
printf 'usage_rc=%s missing_rc=%s\n' "$usage_rc" "$missing_rc"
test ! -e "$LAB/reports/should-not-exist.txt"

Les échecs attendus sont entourés explicitement. Le test vérifie aussi qu’aucune sortie partielle n’a été créée.

08Lance les tests automatiques

"$LAB/tests/test-report.sh" "$LAB"
./module5-text-automation-lab.sh validate

Le test compare la sortie exacte, provoque une entrée absente et contrôle le diagnostic. La commande validate ajoute aussi les agrégations CSV et les comptes HTTP.

09Implémente ta version

cp "$LAB/bin/report-starter.sh" \
  "$LAB/bin/report-student.sh"
chmod +x "$LAB/bin/report-student.sh"
"$LAB/tests/test-report.sh" \
  "$LAB" "$LAB/bin/report-student.sh"
Le premier test échoue tant que le starter n’est pas implémenté. Modifie uniquement report-student.sh jusqu’à obtenir le même contrat, sans recopier aveuglément la référence.
Challenge autonome

Ajoute une option de seuil

Ajoute –slow-ms N, valide que N est un entier positif, conserve la compatibilité des codes de sortie et étends les tests avec un seuil différent. Documente stdout, stderr et rollback.

Ce que tu retiens

Un script robuste possède un contrat, valide ses entrées, protège la sortie précédente, nettoie ses temporaires, retourne des codes utiles et prouve son comportement avec des tests de succès et d’échec.

Ta progression

Chargement de l’état… Se connecter pour synchroniser.