Estou tentando capturar um pressionamento de tecla em um script de shell (por exemplo, usando read
) e não repeti-lo. Os três métodos que encontrei foram stty -echo
o -s
switch e o redirecionamento de fluxo.
No entanto, no macOS, que parece usar uma implementação do FreeBSD, nada disso funciona de forma consistente.
O script a seguir mostra o problema:
while true; do
stty -echo
read -s -n 1 CHAR &>/dev/null
stty echo
done
Ao pressionar as setas para cima e para baixo ao mesmo tempo, às vezes o comando ecoa A^[[B
ou B^[[A
. Isso ocorre com frequência principalmente quando a máquina está lenta (devido à bateria fraca), indicando alguma condição de corrida.
Estou esquecendo de algo? Caso contrário, como posso contornar esse problema?
Responder1
No seu loop, há um curto intervalo de tempo entre o "stty echo" no final do loop e o "stty -echo" na próxima iteração. A entrada do teclado recebida durante esta janela será ecoada, mesmo que nenhum comando de leitura esteja aguardando por ela. Se você não quer ecos, não chame "stty echo"