[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: [HS] exemple de bash avec des controles d'erreur



On 09/21/2017 04:55 PM, David Martin wrote:
> Bonjour,
> 
> Je ne sais pas faire, et je me demandais si vous aviez un exemple de script
> à me montrer qui fait du controle d'erreur à son exécution s'il vous plait ?
> 
> J'ai trouvé un post sur le net, mais avec un exemple ça irai peut etre mieux.
> 
> ;-)
> 
> Je prends vos conseils sinon
> 


Bonsoir David,

Une méthode assez simple et efficace pour limiter la casse en cas
d'erreur avec Bash consiste tout simplement exécuter les scripts
avec l'option "-e".  Vous pouvez commencer n'importe quel script
Bash comme suit :

        #!/bin/bash
        set -e

Dès l'instant où une commande du script renvoie un code d'erreur,
soit une valeur différente de 0 (qui peut être consultée via la
variable $? après exécution d'une commande), le script s'arrête
en renvoyant lui-même ce code d'erreur.

Ceci reste vrai tant que le script n'a pas prévu un traitement de
l'erreur pour une commande donnée.  Pour traiter un tel cas
d'erreur vous avez plusieurs options :

1. Exécutez la commande dans un bloc "if".  Si la commande
   réussit, le bloc "then" est exécutée, si elle échoue, le bloc
   "else" est exécuté, puis le script continue.  Par exemple :

        if
                grep color .bashrc
        then
                echo "OK"
        else
                echo "KO"
        fi

   affichera "OK" si la chaine "color" apparaît dans le fichier
   ".bashrc", "KO" sinon.

2. Si c'est juste pour empêcher une commande de planter le script
   en cas d'erreur, vous pouvez utiliser l'opérateur "||"
   vaguement inspiré du C, pour lequel la seconde opérande est
   exécutée si la première échoue, puis le script continue :

        grep color .bashrc || echo "KO"

3. Couper l'option "-e" en ajoutant au moment voulu dans le
   script :

        set +e

   mais comme c'est triste, il ne faut pas oublier de rétablir
   l'option une fois la section problématique passée.  Ça peut
   servir si vous avez de nombreux traitements dans un bloc
   "case" traitant différentes erreurs stockées dans $? par
   exemple :

        set +e
        grep color .bashrc
        case $? in
        0 ) echo "No problem"           ;;
        1 ) echo "No color in there"    ;;
        2 ) echo "No .bashrc in there"  ;;
        * ) echo "Unknown error"        ;;
        esac
        set -e

Vous pouvez consulter le code de retour dans une session
interactive comme suit :

        $ grep color .bashrc
        alias ls='ls --color=auto'

        $ echo $?
        0

        $ grep colour .bashrc

        $ echo $?
        1

Étant donné le nombre de possibilités de Bash, je suis à peu près
certain d'avoir oublié un certain nombre de manières de traiter
les erreurs, mais ça devrait vous donner la base pour travailler.

Tous les détails du Bash sont disponibles dans sa page de manuel,
mais vous pouvez aussi consulter l'aide des différents "builtins"
avec la commande "help" :

        $ help function
        function: function name { COMMANDS ; } or name () { COMMANDS ; }
            Define shell function.
        [...]

        $ man bash

Cette aide est disponible en Français si vous avez installé votre
système avec cette langue par défaut.

Si vous êtes anglophone et que vous avez du temps, l'excellent
« Advanced Bash-Scripting Guide » de Mendel Cooper permet d'être
très au point sur la rédaction de scripts shell.  Il est
librement disponible ici :

        http://tldp.org/LDP/abs/html/

On dirait qu'une traduction Française est aussi disponible :

        https://abs.traduc.org/abs-6.4.05-fr/

J'ai beaucoup appris avec ce livre.  :)


À plus,
-- 
Étienne Mollier <etienne.mollier@mailoo.org>

        Shell programming is a 1950s juke box . . .
        --Larry Wall


Reply to: