Leitura char-by-char silenciosamente não funciona

3

Estou tentando ler o arquivo de entrada do usuário por caractere, silenciosamente, da seguinte maneira:

while [ 1 ]; do
  read -s -N 1
  ...
done

Enquanto este loop funciona perfeitamente usando o VNC ( xterm ), ele funciona apenas parcialmente usando o putty (xterm) ou um terminal Linux e a maioria dos outros terminais de texto.

O problema é encontrado quando eu me torno "selvagem" com o teclado e pressiono várias teclas ao mesmo tempo, e que algumas das teclas são ecoadas apesar do modo -s .

Eu também tentei redirecionar a saída e stty -echo . enquanto o primeiro não fazia qualquer diferença, o último seria de alguma forma útil, minimizando os "ecos" a serem menos frequentes, mas não perfeitos.

Alguma idéia?

    
por linadif 03.12.2014 / 10:07

1 resposta

4

read -s desativa o terminal echo apenas para a duração desse comando read . Então, se você digitar algo entre dois comandos read , o driver do terminal irá echo de volta.

Você deve desabilitar echo e, em seguida, chamar read em seu loop sem -s :

if [ -t 0 ]; then
  saved=$(stty -g)
  stty -echo
fi
while read -rN1; do
  ...
done
if [ -t 0 ]; then
  stty "$saved"
fi
    
por 03.12.2014 / 10:30