« 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"
-e-upipefail-E03Valide 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.
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"
report-student.sh jusqu’à obtenir le même contrat, sans recopier aveuglément la référence.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.