Re: [SSFR] capturer un evenement dans une boucle while

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


On Sun, Dec 11, 2005 at 09:46:29PM +0000, Bayrouni wrote:
> je fais appel à vous encore une fois pour une question de debutant:
> 
> Comment capturer un évenement dans une boucle while:
> 
> while [ condition]; do
>    faire quelque chose
>    si on appuie sur une touche|caractère sortir de la boucle ## Objet 
> de la question
> done

en d'autres termes, comment lire des entrées clavier en shell ?
read est ton amis, si on se limite a ton exemple, en bash cela donne:

while : cond; do
  : faire quelque chose
  read -n1 variable_recevant_la_valeur_lu
  break
done

ce qui n'est pas tres utile, sachant que read est bloquant par defaut
la boucle elle meme ne sert a rien, un if en lieu et place du while
serait semantiquement equivalent, de plus l'on est deja en dehors des
shell POSIX qui ne connaissent pas la lecture d'un unique caractere
avec read (par exemple zsh utilisera -k a la place de -n pour specifier
le nombre de caracteres a lire). Suivant le shell il y aura generalement
des options permettant de definir un delais ou il est possible de generer
l'equivalent de diverses manieres. note que parler "d'evenements" dans
le contexte d'interface utilisateur sur un shell prete a confusion
avec les bibliotheques d'UI graphiques ou pas pour lesquelles un modele
evenementiel est courant.

sans plus de precisions il y a foule de reponses potentielles a ton
probleme mais si l'on se limite a du shell POSIX le plus simple est
sans doute de lancer le "quelque chose a faire" en tache de fond en
utilisant un mecanisme d'IPC quelconque pour l'arreter a partir du
process du premier plan, simple "lockfile", signal, autres...
Evidemment les solutions seront plus ou moins adaptées suivant ce qui
doit etre fait et la façon de cela peut/doit etre arreté.

exemple bidon en bash (non testé):

echo appuyez sur une touche pour arreter...

{ trap COND=false USR1
  COND=true
  while $COND; do
    echo ca bosse...
    sleep 1
  done
  echo ca bosse plus...
} &

read -s -n1 # la touche utilisée est ici indifferente.
kill -USR1 $!
wait $! # $! represente le pid du dernier process lancé en background.
        # voir egalement jobs et les jobspecs pour eviter les problemes
        # de synchros potentiels.
echo fini

plus globalement pour les questions de debutants (et moins debutants)
sur le scripting shell et bash en particulier, voir le classique:
http://tldp.org/LDP/abs/html/

                                hope this help, xavier.

-- 
pwet
-- 
klapwet
-- 
tripleklapwet




Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/