web-dev-qa-db-fra.com

Comment utiliser Bash read avec un timeout?

Je peux demander à l'utilisateur d'appuyer sur Enter en utilisant read, et lui faire attendre en appelant sleep. Mais je ne peux pas penser à une façon de faire les deux en même temps. J'aimerais que l'utilisateur ait le choix:

Presse Ctrl+C annuler, Enterpour continuer ou juste attendre 10 secondes

Comment puis je faire ça?

64
qdii

Dans bash, read a un -t option où vous pouvez spécifier un délai. Depuis la page de manuel:

read [-ers] [-u fd] [-t timeout] [-a aname] [-p Prompt] [-n nchars] [-d delim] [name ...]

-t timeout: provoque la fin du délai de lecture et l'échec du retour si une ligne complète d'entrée n'est pas lue dans les secondes de délai. Cette option n'a aucun effet si read ne lit pas l'entrée du terminal ou d'un tuyau.

Transcription ci-dessous (sans appuyer sur ENTER):

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:29:15 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:29:25 WAST 2012

Un autre, en appuyant sur ENTER après quelques secondes:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; date
Tue Feb 28 22:30:17 WAST 2012
Hit ENTER or wait ten seconds
Tue Feb 28 22:30:19 WAST 2012

Et un autre, frapper CTRL-C:

$ date ; read -t 10 -p "Hit ENTER or wait ten seconds" ; echo ; date
Tue Feb 28 22:30:29 WAST 2012
Hit ENTER or wait ten seconds
119
paxdiablo

La fonction intégrée read a un délai d'expiration.

read -t 10

le fera

15
Johannes Weiss

Depuis le manuel de référence bash :

read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p Prompt][-t timeout][-u fd] [name ...]

1
Benoit