Comment gérer les erreurs d’éxécution avec bash?

Introduction

Tout d’abord bash est un langage de programmation pour lancer des programmes. Après tout c’est le travail d’un interpréteur de commande.

Souvent je vois des script utilisant principalement la fonction system. Ceci n’a pas de sens! Remplacer l’extention .pl en .sh puis enlever system et vous avez pratiquement un script bash!

Le problème

Beaucoup de personne pensent connaître bash mais finalement il n’en est rien. Il est tellement facile de lancer des commandes en bash…

Comment gérer les erreurs ?

C’est le travail de la built-in trap !

  1. # die
  2. # This function is used to raise an error
  3. # Parameters:
  4. # - line number
  5. # - message
  6. # - exit code (optional)
  7. die () {
  8.     local parent_lineno message code
  9.       parent_lineno="$1"
  10.       message="$2"
  11.       [[ -n $3 ]] && code="$3" || code=1
  12.       if [[ -n "$message" ]] ; then
  13.         echo "Error on or near line ${parent_lineno}: ${message}; exiting with status ${code}" >&2
  14.       else
  15.         echo "Error on or near line ${parent_lineno}; exiting with status ${code}" >&2
  16.       fi
  17.       end "${code}"
  18. }
  19. ## MAIN
  20. trap 'die ${LINENO}'  1 15 ERR
  21. ls $RANDOM
  22. echo 'I am here'

Qu’avons nous fait ?:

  • ligne 6-19 nous déclarons la fonction die
  • ligne 21 nous disons à bash d’apeller la fonction die si le processus se termine avec le signale ERR, 1 où 15
  • ligne 22 nous essayons de lister un fichier ayant pour nom la valeur retourner par $RANDOM . Je suppose qu’un tel fichier n’existe pas
  • la ligne 23 est jamais appelé à moins que vous ayez un fichier ayant le même nom que la valeur retourné par $RANDOM

Personnaliser le message d’erreur

Parfois vous voudrez donner un message spécifique. C’est possible, regardez:

ls $RANDOM || die 'File unknown' 1

Si ls échoue la fonction die sera appelée avec le message spécifié puis le script se terminera avec le code 1.

Rendre plus solide les fonctions bash

Avec le même code vous pouvez faire des choses proche de la programmation par contrat.

…
foo(){
    [[ $# -eq 2 ]] || die 'foo function need two parameters: first name, last name'
    [[ -s "$1" ]]  || die 'first name should not to be empty'
    [[ -s "$2" ]]  || die 'last name should not to be empty'
    echo "hello $1 $2"
}

Comme vous pouvez le voir la fonction die avec la builtin trap améliorera vos script bash.

La built-in command

Pour continuer sur le même sujet il y a une built-in peu connue. C’est command. Rechercher de l’aide sur cette built-in via votre moteur de recherche préféré est quasiment impossible car command est un mot clef trop générique.

Cette built-in va lancer pour vous un programme, une commande …

  • avec -v activation du mode verbeux. utile pour le débogage
  • avec -p il utilisera le PATH par défaut. Utile afin de ne pas casser votre workflow parcequ’une personne lambda a modifié son PATH
  • n’utilisera pas les alias, vus rendrez l’éxécution de votre script plus sure. Combien de personne font un alias sur ls, grep …?

Comme vous pouvez le voir la built-in command va rendre votre script plus sure.

Share Button

Laisser un commentaire