Bonnes pratiques pour écrire un script

Dans Linux, un script est un fichier rassemblant une succession de commandes.
Toutes les commandes peuvent être écrites les unes à la suite des autres.
Elles sont exécutées séquentiellement par le shell.

Pour une bonne exécution du script, il est toutefois conseillé de le structurer correctement pour éviter les mauvaises surprises.

Personnellement, je respecte toujours les règles suivantes :

1 - Toujours nommer son script avec l'extension ".sh" (facilite la recherche)

2 - La première ligne d'un script doit toujours indiquer quel interpréteur de commande utiliser, par exemple :
#!/bin/bash
#!/bin/sh
#!/usr/bin/python
#!/usr/bin/php

3 - Renseigner la variable PATH :
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

La variable PATH permet d'indiquer au shell les répertoires où sont situés les commandes externes utilisées.
En console, la variable PATH est initialisée à la connexion ce qui fait qu'il n'est pas nécessaire d'indiquer le chemin complet d'une commande afin de l'exécuter. Si le script est exécuté uniquement en console, il n'est pas nécessaire d'initialiser la variable PATH mais si le script est exécuté via une tâche cron, la variable PATH est inconnue, dans ce cas, toutes les commandes externes utilisées dans le script ne pourront pas être exécutées.

4 - Rediriger la sortie d'erreur standard dans un fichier de log spécifique, par exemple :
exec 2>>/var/log/mon_script_error.log
exec 2>/dev/null (s'il n'est pas nécessaire de "logguer" les différentes erreurs rencontrées)

5 - Terminer le script avec la commande suivante :
exit 0

Exemple avec un script basique :

$ cat mon_script.sh
#!/bin/bash
 
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
 
exec 2>/dev/null
 
...
mes commandes
...
 
exit 0

Commentaires

Même si globalement c'est intéressant, une erreur flagrande est citée : finir le programme par un "exit 0".
Si "tes commandes" s'exécutent pas correctement et font n'importe quoi, c'est pas grave, de toute façon le script fini par "exit 0". Comme cela, on croira que tout s'est bien passé !
Il faut donc savoir gérer dans le script les codes retours et faire en sorte que si ce script ne s'exécute pas correctement, il sorte avec un code retour différent de 0.

... c'est pour cette raison qu'au point 4 j'indique ceci:

exec 2>>/var/log/mon_script_error.log

dans la cas où l'on souhaite tracer les erreurs, ou bien:

exec 2>/dev/null

si la gestion des erreurs n'a pas d'importance.

Mais il est vrai que la gestion des erreurs est tellement complexe, que ce n'est pas évident de l'expliquer sans avoir un cas concrêt.

Toujours est-il que je pense qu'il est quand même préférable que la dernière ligne d'un script soit "exit 0" et que les erreurs soient gérées au fur et à mesure  de l'exécution du script.
De cette manière, si toutes les opérations se sont bien déroulées, le script se termine correctement.

Ajouter un commentaire

Filtered HTML

  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Tags HTML autorisés : <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Les lignes et les paragraphes vont à la ligne automatiquement.

Plain text

  • Aucune balise HTML autorisée.
  • Les adresses de pages web et de messagerie électronique sont transformées en liens automatiquement.
  • Les lignes et les paragraphes vont à la ligne automatiquement.
CAPTCHA
Cette question permet de s'assurer que vous êtes un utilisateur humain et non un logiciel automatisé de pollupostage.
CAPTCHA visuel
Entrez les caractères (sans espace) affichés dans l'image.