81 votes

Comment utiliser Bash read avec un timeout ?

Je peux demander à l'utilisateur d'appuyer sur Enter en utilisant read et faites-le attendre en appelant sleep . Mais je n'arrive pas à trouver un moyen de faire les deux en même temps. Je voudrais que l'utilisateur ait le choix :

Appuyez sur Ctrl + C pour annuler, Enter  pour continuer ou attendre 10 secondes

Comment puis-je faire ça ?

159voto

paxdiablo Points 341644

Sur bash , read a un -t où vous pouvez spécifier un délai d'attente. De la page de manuel :

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

-t timeout: provoque le dépassement du délai de lecture et le retour d'un échec si une ligne complète d'entrée n'est pas lue dans les secondes du délai. Cette option n'a aucun effet si read n'est pas en train de lire une entrée depuis le terminal ou un tube.

Transcription ci-dessous (sans appuyer sur la touche 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, en appuyant sur 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

17voto

Johannes Weiß Points 19013

Le site read a un délai d'attente.

read -t 10

le fera

3voto

user2070305 Points 275

En s'appuyant sur les réponses réfléchies ci-dessus, la valeur de retour de la lecture est utile pour faire la distinction entre une réponse vide de l'utilisateur (par exemple "Appuyer sur Entrée" pour l'action par défaut) et un délai d'attente.

read -t 5 -p "Prompt " RESP
if [[ $? -gt 128 ]] ; then
    echo -e "\nTimeout"
else
    echo "Response = \"$RESP\""  # adding quotes so empty strings are obvious
fi

Une autre information utile est que le -p "prompt " est écrit dans stderr (et non stdout), donc si vous redirigez stderr, l'invite ne sera pas affichée. Un exemple de ceci serait d'enregistrer une trace d'exécution dans un fichier journal pour une analyse ultérieure. Pour utiliser read -p Prompt dans ce cas, vous pouvez rediriger stderr vers l'utilisateur pour l'instruction read uniquement.

set -x
exec 2>logfile
read -t 5 -p "Prompt " RESP 2>/dev/tty

0voto

Benoit Points 35553

De la 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 ...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X