Tengo el siguiente script bash:
# do some time consuming task here
read -p "Give me some input: " input
Ahora, como habrás adivinado, si un usuario presiona algunas teclas aleatorias durante la "tarea que consume mucho tiempo", la entrada no deseada también se tiene en cuenta. ¿Cómo borro stdin
(o al menos lo ignoro) antes de emitir el comando de lectura?
Respuestas:
No creo que haya una manera de borrar stdin pero (con bash) puedes leer y descartar lo que hay antes de pedir la entrada
Esto lee stdin y tiene un tiempo de espera de 1 segundo, aunque falla si hay más de 10000 caracteres en stdin. No sé qué tan grande puedes hacer el parámetro nchars.
fuente
En Bash 4, puede establecer
-t
(tiempo de espera) en0
. En este caso,read
regresa inmediatamente con un estado de salida que indica si hay datos en espera o no:fuente
Esto lee múltiples líneas de entradas, si el usuario presionó inadvertidamente ingresar varias veces
fuente
esto funcionó bien para mí:
fuente
-e
en este caso?Adjunte la tarea que consume tiempo en un bloque cuyo stdin está cerrado:
fuente
read
seguirá leyendo la primera línea ingresada durante la# time consuming
tarea. Además, si el script no contiene ningún comando que lea stdin después deread
eso, las líneas no leídas se ejecutan en el terminal interactivo después de que finaliza el script. ¿Alguien probó con éxito esto?Sobre la base de la respuesta de Christophjaeger, agregué
-s
para que la entrada no se repita en la terminal y-n
para que no espere una nueva línea.fuente
-n
es una buena idea, pero dos respuestas anteriores ya lo han mencionado. Y dado que el objetivo de este ejercicio es leer y descartar todo lo que se escribió antes de suread
ejecución , no entiendo qué bien cree-s
que va a hacer.fuente