Rendre un script robuste
Le mode strict de Bash, trap pour nettoyer, mktemp, les erreurs sur la sortie d'erreur avec un code de retour, l'idempotence et shellcheck : savoir où s'arrête un script et ce qu'il laisse derrière lui.
- 30 cartes
- 5 thèmes
- Gratuit
Le programme, thème par thème
Le poids de chaque thème suit celui que lui donne l'examen.
- Notions
- Questions
- Ranger et relier
- Mises en situation
- Comprendre
Quelques cartes du deck
Mode strict : de quoi s'agit-il ?
Voir la réponse
Trois réglages de Bash qui font échouer un script au lieu de le laisser continuer :
set -e(arrêt sur erreur),set -u(variable non définie) etset -o pipefail(échec dans un tube).Sans lui,
cd /nopeéchoue et le script poursuit avecrm -rf *dans le mauvais dossier. Maisset -eignore les échecs d'un test (if,&&,||) : il ne remplace pas la vérification des cas prévisibles.Que se passe-t-il à l'exécution de ce script ?
```bash
set -e
cd /nope
echo fini`- Il s'arrête sur l'erreur de
cd, code 1, sans afficherfini - Il affiche l'erreur de
cd, puisfini, et rend le code 0 - Il affiche
finisans erreur, carcdne fait que changer de dossier - Il demande une confirmation avant de poursuivre le script
Voir la réponse
Il s'arrête sur l'erreur de
cd, code 1, sans afficherfinicd /nopeéchoue (« No such file or directory ») ; sousset -e, tout échec de commande simple arrête le script avec le code de cette commande, ici 1. Sansset -e,finis'afficherait.- Il s'arrête sur l'erreur de
Avec set -u, lire une variable jamais définie arrête le script sur le message « unbound variable » ; sans lui, Bash la remplace par ….
Voir la réponse
Avec set -u, lire une variable jamais définie arrête le script sur le message « unbound variable » ; sans lui, Bash la remplace par une chaîne vide.
C'est ce qui attrape la faute de frappe
rm -rf "$dosier"/*: sans-u, la variable vide donne/*. Pour une variable facultative, une valeur par défaut évite l'arrêt :${1:-defaut}.pipefail : de quoi s'agit-il ?
Voir la réponse
Réglage qui donne à un tube le code de la dernière commande qui a échoué, au lieu de celui de sa seule dernière commande.
false | truerend 0 par défaut : l'échec defalsepasse inaperçu. Avecset -o pipefail, il rend 1, etset -epeut alors arrêter le script.Chaque nuit, le dossier
/tmpgrossit de 2 Go jusqu'à remplir le disque. Le script de traitement crée un fichier avectmp=$(mktemp)et le supprime à sa dernière ligne, mais s'arrête parfois sur une erreur. Quelle correction est juste ?- Ajouter
trap 'rm -f "$tmp"' EXITjuste aprèsmktemp - Écrire le
rm -fau début du script plutôt qu'à la fin - Remplacer
mktemppar un nom fixe dans/tmp - Ajouter
set -upour que le script s'arrête plus tôt
Voir la réponse
Ajouter
trap 'rm -f "$tmp"' EXITjuste aprèsmktempQuand le script s'arrête avant sa dernière ligne, le
rmfinal n'est jamais lancé et le fichier reste. Le trapEXITs'exécute quelle que soit la façon dont le script se termine. Unrmau début supprimerait un fichier qui n'existe pas encore.- Ajouter