J'ai le script bash suivant:
# do some time consuming task here
read -p "Give me some input: " input
Maintenant, comme vous l'avez peut-être deviné, si un utilisateur appuie sur des touches aléatoires pendant la "tâche longue", l'entrée indésirable est également prise en compte. Comment effacer stdin
(ou au moins l'ignorer) avant d'émettre la commande de lecture?
Réponses:
Je ne pense pas qu'il y ait un moyen d'effacer stdin mais (avec bash) vous pouvez lire et jeter ce qui est là avant de demander l'entrée
Cela lit stdin et a un délai d'attente de 1 seconde, mais il échoue s'il y a plus de 10000 caractères dans stdin. Je ne sais pas quelle taille vous pouvez faire pour le paramètre nchars.
la source
Dans Bash 4, vous pouvez définir
-t
(timeout) sur0
. Dans ce cas,read
retourne immédiatement avec un état de sortie indiquant s'il y a des données en attente ou non:la source
Cela lit plusieurs lignes d'entrées, si l'utilisateur a appuyé par inadvertance sur plusieurs fois
la source
cela a bien fonctionné pour moi:
la source
-e
dans ce cas?Mettez la tâche longue dans un bloc dont stdin est fermé:
la source
read
lira toujours la première ligne entrée pendant la# time consuming
tâche. De plus, si le script ne contient aucune commande lisant stdin après le,read
les lignes non lues sont exécutées sur le terminal interactif une fois le script terminé. Quelqu'un a-t-il réussi à tester cela?En me basant sur la réponse de christophjaeger, j'ai ajouté
-s
pour que l'entrée ne soit pas répercutée sur le terminal et-n
pour qu'il n'attende pas une nouvelle ligne.la source
-n
est une bonne idée, mais deux réponses précédentes l'ont déjà mentionné. Et étant donné que le but de cet exercice est de lire et de jeter tout ce qui a été tapé avant l'read
exécution , je ne comprends pas à quoi vous pensez que cela-s
va faire du bien.la source