Você deseja chamar a função tcflush()
POSIX para liberar a entrada pendente.
Por exemplo, com:
perl -MPOSIX -e 'tcflush 0,0'
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
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
}