# [bash] Utilisation miltiple de la commande trap [Résolu]

## bivittatus

salut tout le monde!

Je suis en train de faire un petit script de mise à jour de ma gentoo sans prétention et je bloque sur un truc tout bête!

Je pars d'un menu et suivant le choix, j'ai un compte à rebours qui se déclenche (5 secondes) et je peux interrompre ce compte à rebours par un Ctrl-c pour revenir au menu.

Jusque là, pas de soucis...

Par contre, après avoir utilisé une fois le Ctrl-c (qui fonctionne à merveille...la première fois), je ne peux plus le réutiliser!

Mon petit compteur:

```
compteur () {

   echo -e "L'action demandée démarrera dans 5 secondes s(Ctrl-C pour retourner au menu)...\n"

   trap 'menu' INT

   for i in  {5..1}

   do

      echo -e "\033[31m$i  \033[0m\c"

          sleep 1

   done

   echo -e ""

}
```

Je suppose qu'il faut réinitialiser le trap ou un truc du genre, mais...je ne vois pas...j'ai beau essayer de mettre du trap - INT à gogo, y a rien à faire!

Alors si une âme charitable passe par là, je l'en remercie par avance!  :Very Happy: 

----------

## netfab

Salut,

Je ne suis pas certain que tu puisses te baser sur trap pour effectuer ce que tu cherches à faire.

Voici une autre façon de procéder en utilisant une boucle while :

```

#!/bin/bash

ACTION='not_done'

function menu {

        clear

        echo 'affiche menu'

        # ici il faut récupérer le choix de l'utilisateur et lancer l'action correspondante

        compteur

}

compteur () {

   echo -e "L'action demandée démarrera dans 5 secondes s(Ctrl-C pour retourner au menu)...\n"

   trap 'return' INT

   for i in  {5..1}

   do

      echo -e "\033[31m$i  \033[0m\c"

          sleep 1

   done

   ACTION='done'

   echo -e 'Action effectuée'

   echo -e ""

}

while [ "$ACTION" != 'done' ]

do

        menu

done

```

----------

## bivittatus

Super!

Merci beaucoup netfab! Effectivement, ça fonctionne; Il faut juste que j'appelle la fonction compteur au sein de chaque opération à effectuer, non pas au niveau du menu.  :Very Happy: 

Par contre, j'avoue qu'étant débutant en scripts, je n'arrive pas à déchiffrer ta méthode, donc si tu avais le temps de m'expliquer tout ça, ce serait vraiment génial!

Merci  :Wink: 

----------

## netfab

Je commence par définir une variable globale :

```

ACTION='not_done'

```

qui est utilisée dans la boucle while principale :

```

while [ "$ACTION" != 'done' ]

do

        menu

done

```

La fonction menu est donc appelée indéfiniment, tant que la variable $ACTION n'est pas égale à 'done'.

Le seul endroit où cette variable $ACTION est définie à done, c'est dans ta fonction compteur, juste après ta boucle for affichant le décompte, ce qui revient à dire que la boucle infinie while affichera le menu tant que le décompte n'aura pas été jusqu'au bout.

Au moment du décompte, si l'utilisateur fait un <Ctrl+C>, un simple return est exécuté, ce qui arrête instantanément la fonction compteur :

```

trap 'return' INT

```

Après il te reste à afficher correctement le menu, récupérer le choix de l'utilisateur, et en fonction de ce choix, lancer le décompte puis l'action correspondante.

----------

## bivittatus

C'est super sympa netfab, c'est plus clair maintenant!

De nouveau un grand merci à toi... :Wink: 

----------

