Como suprimir o eco da função de leitura com erros

Como suprimir o eco da função de leitura com erros

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 -echoo -sswitch 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^[[Bou 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"

informação relacionada