Stations de travail en ligne OnWorks Linux et Windows

Logo

Hébergement gratuit en ligne pour les postes de travail

<Précédent | Table des matières | Suivant>

Programmation défensive

Il est important de vérifier les hypothèses lors de la programmation. Cela signifie une évaluation minutieuse de l'état de sortie des programmes et des commandes utilisés par un script. Voici un exemple, tiré d'une histoire vraie. Un administrateur système malheureux a écrit un script pour effectuer une tâche de maintenance sur un serveur important. Le script contenait les deux lignes de code suivantes :


cd $nom_répertoire rm *

cd $nom_répertoire rm *


Il n'y a rien de mal intrinsèquement avec ces deux lignes, tant que le répertoire nommé dans la variable, nom_rép, existe. Mais que se passe-t-il si ce n'est pas le cas ? Dans ce cas, le cd La commande échoue et le script passe à la ligne suivante et supprime les fichiers du répertoire de travail actuel. Pas du tout le résultat souhaité ! Le malheureux administrateur a détruit une partie importante du serveur à cause de cette décision de conception.

Regardons quelques façons dont cette conception pourrait être améliorée. Premièrement, il serait peut-être sage de rendre l'exécution de rm subordonnée à la réussite de cd:


cd $dir_name && rm *

cd $dir_name && rm *


De cette façon, si le cd la commande échoue, le rm la commande n'est pas exécutée. C'est mieux, mais laisse toujours ouverte la possibilité que la variable, nom_rép, n'est pas défini ou est vide, ce qui entraînerait la suppression des fichiers du répertoire de base de l'utilisateur. Cela pourrait également être évité en vérifiant que nom_rép contient en fait le nom d'un répertoire existant :



[[ -d $dir_name ]] && cd $dir_name && rm *

[[ -d $dir_name ]] && cd $dir_name && rm *


Souvent, il est préférable d'inclure une logique pour terminer le script et signaler une erreur lorsqu'une situation telle que celle ci-dessus se produit :



# Supprimer les fichiers dans le répertoire $dir_name si [[ ! -d "$nom_rép" ]] ; alors

echo "Aucun tel répertoire : '$dir_name'" >&2 exit 1

fi

si ! cd $dir_name; alors

echo "Impossible de cd vers '$dir_name'" >&2 exit 1

fi

si ! rm *; alors

echo "Echec de la suppression du fichier. Vérifier les résultats" >&2 exit 1

fi

# Supprimer les fichiers dans le répertoire $dir_name si [[ ! -d "$nom_rép" ]] ; alors

echo "Aucun tel répertoire : '$dir_name'" >&2 exit 1

fi

si ! cd $dir_name; alors

echo "Impossible de cd vers '$dir_name'" >&2 exit 1

fi

si ! rm *; alors

echo "Echec de la suppression du fichier. Vérifier les résultats" >&2 exit 1

fi


Ici, nous vérifions à la fois le nom, pour voir qu'il s'agit de celui d'un répertoire existant, et le suc-

Erreurs logiques


cess de la cd commander. Si l'un ou l'autre échoue, un message d'erreur descriptif est envoyé à l'erreur standard et le script se termine avec un état de sortie de un pour indiquer un échec.


Meilleur système d'exploitation Cloud Computing chez OnWorks :