Como ignorar o buffer de entrada do teclado entre dois 'read'

1

Quando eu executo um script como

read -n 1 -p 'Enter first variable: ' var1
if echo "${var1}" | grep -iq "^y"
then
    echo "okay"
else
    echo "not okay"
fi

sleep 2

read -n 1 -p 'Enter second variable: ' var2
if echo "${var2}" | grep -iq "^y"
then
    echo "okay"
else
    echo "not okay"
fi

Se eu executar este código, tecle y e então pressione n no intervalo de 2 segundos, o n será salvo no buffer e dado para o próximo read , e é por isso que ele não espera e solicita a entrada do usuário para Enter second variable: , ele simplesmente fornece a chave no buffer ie n aqui.

Para deixar claro, estou parafraseando a minha pergunta em palavras diferentes nas seguintes perguntas, mas a questão é apenas uma.

Como faço para impedir que as chaves sejam armazenadas na memória? OU

Como eu ignoro a entrada do usuário no buffer para a segunda variável var2 ? OU

Como faço para desabilitar / ignorar a entrada do teclado entre meu primeiro e segundo read , de modo que seja o que for que eu digite no intervalo de 2 segundos após o primeiro read , ele não serve como entrada para o segundo read

    
por GypsyCosmonaut 26.07.2017 / 16:46

2 respostas

2

Você deseja chamar a função tcflush() POSIX para liberar a entrada pendente.

Por exemplo, com:

perl -MPOSIX -e 'tcflush 0,0'
    
por 26.07.2017 / 18:35
2

Se você estiver usando o bash shell, então, de uma maneira simples, você pode tentar ler um único caractere da entrada usando um tempo limite de quase 0. Isso retorna true se algo foi lido, então você precisa tentar novamente . Por exemplo, coloque esta função no início do seu script e chame-a entre a suspensão e a seguinte leitura:

flush(){
  while read -N 1 -t 0.01
  do :
  done
}
    
por 26.07.2017 / 17:53