View previous topic :: View next topic |
Author |
Message |
bivittatus l33t
Joined: 31 Jan 2006 Posts: 687 Location: Roissy-en-Brie (France)
|
Posted: Wed Mar 27, 2013 9:31 pm Post subject: [bash] Utilisation miltiple de la commande trap [Résolu] |
|
|
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! _________________ 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 |
|
|
netfab Veteran
Joined: 03 Mar 2005 Posts: 1897 Location: 127.0.0.1
|
Posted: Thu Mar 28, 2013 5:36 pm Post subject: |
|
|
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 |
|
|
bivittatus l33t
Joined: 31 Jan 2006 Posts: 687 Location: Roissy-en-Brie (France)
|
Posted: Thu Mar 28, 2013 7:46 pm Post subject: |
|
|
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.
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 |
|
|
netfab Veteran
Joined: 03 Mar 2005 Posts: 1897 Location: 127.0.0.1
|
Posted: Fri Mar 29, 2013 10:10 am Post subject: |
|
|
Je commence par définir une variable globale :
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 :
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 |
|
|
bivittatus l33t
Joined: 31 Jan 2006 Posts: 687 Location: Roissy-en-Brie (France)
|
Posted: Sat Mar 30, 2013 6:36 am Post subject: |
|
|
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 |
|
|
|