Estoy intentando capturar una pulsación de tecla en un script de Shell (por ejemplo, usando read
) y no repetirla. Los tres métodos que encontré fueron stty -echo
el -s
cambio y la redirección de transmisión.
Sin embargo, en macOS, que parece utilizar una implementación de FreeBSD, ninguno de estos funciona de manera consistente.
El siguiente script muestra el problema:
while true; do
stty -echo
read -s -n 1 CHAR &>/dev/null
stty echo
done
Al presionar las flechas hacia arriba y hacia abajo al mismo tiempo, a veces el comando hace eco A^[[B
o B^[[A
. Esto ocurre particularmente a menudo cuando la máquina va lenta (debido a una batería baja), lo que indica alguna condición de carrera.
¿Me estoy perdiendo de algo? De lo contrario, ¿cómo puedo solucionar este problema?
Respuesta1
En su bucle, hay un breve período de tiempo entre el "stty echo" al final del bucle y el "stty -echo" en la siguiente iteración. La entrada del teclado recibida durante esta ventana se repetirá, aunque no haya ningún comando de lectura esperando. Si no quieres ecos, no llames "stty echo"