Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[bash] Utilisation miltiple de la commande trap [Résolu]
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
bivittatus
l33t
l33t


Joined: 31 Jan 2006
Posts: 687
Location: Roissy-en-Brie (France)

PostPosted: Wed Mar 27, 2013 9:31 pm    Post subject: [bash] Utilisation miltiple de la commande trap [Résolu] Reply with quote

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:

Code:
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! :D
_________________
Linus TORVALDS: "Je ne suis pas là pour détruire Microsoft. Ce sera juste un effet secondaire tout à fait involontaire."


Last edited by bivittatus on Sun Mar 31, 2013 2:58 pm; edited 1 time in total
Back to top
View user's profile Send private message
netfab
Veteran
Veteran


Joined: 03 Mar 2005
Posts: 1896
Location: 127.0.0.1

PostPosted: Thu Mar 28, 2013 5:36 pm    Post subject: Reply with quote

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 :
Code:

#!/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

Back to top
View user's profile Send private message
bivittatus
l33t
l33t


Joined: 31 Jan 2006
Posts: 687
Location: Roissy-en-Brie (France)

PostPosted: Thu Mar 28, 2013 7:46 pm    Post subject: Reply with quote

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. :D

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 ;)
_________________
Linus TORVALDS: "Je ne suis pas là pour détruire Microsoft. Ce sera juste un effet secondaire tout à fait involontaire."
Back to top
View user's profile Send private message
netfab
Veteran
Veteran


Joined: 03 Mar 2005
Posts: 1896
Location: 127.0.0.1

PostPosted: Fri Mar 29, 2013 10:10 am    Post subject: Reply with quote

Je commence par définir une variable globale :
Code:

ACTION='not_done'

qui est utilisée dans la boucle while principale :
Code:

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 :
Code:

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.
Back to top
View user's profile Send private message
bivittatus
l33t
l33t


Joined: 31 Jan 2006
Posts: 687
Location: Roissy-en-Brie (France)

PostPosted: Sat Mar 30, 2013 6:36 am    Post subject: Reply with quote

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

De nouveau un grand merci à toi...;)
_________________
Linus TORVALDS: "Je ne suis pas là pour détruire Microsoft. Ce sera juste un effet secondaire tout à fait involontaire."
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum