Limpar stdin antes de ler

13

Eu tenho o seguinte script:

# do some time consuming task here
read -p "Give me some input: " input

Agora, como você deve ter imaginado, se um usuário pressionar algumas teclas aleatórias durante a "tarefa demorada", a entrada indesejada também será levada em conta. Como faço para limpar stdin (ou pelo menos ignorá-lo) antes de emitir o comando de leitura?

    
por rabin 28.04.2011 / 17:30

7 respostas

8

Eu não acho que haja uma maneira de limpar o stdin, mas (com o bash) você pode ler e descartar o que está lá antes de pedir a entrada

#do some time consuming task here
read -t 1 -n 10000 discard 
read -p "Give me some input: " input

Isto lê stdin e tem um timeout de 1 segundo, mas falha se houver mais de 10000 caracteres em stdin. Eu não sei o quão grande você pode fazer o parâmetro nchars.

    
por 28.04.2011 / 18:01
14

No Bash 4, você pode definir -t (tempo limite) como 0 . Nesse caso, read retorna imediatamente com um status de saída indicando se há dados aguardando ou não:

# do some time consuming task here
while read -r -t 0; do read -r; done
read -p "Give me some input: " input
    
por 20.07.2013 / 22:48
5
read -d '' -t 0.1 -n 10000

Isto lê várias linhas de entradas, se o usuário pressionou inadvertidamente a inserir várias vezes

    
por 04.12.2011 / 08:53
5

isso funcionou bem para mim:

function clean_stdin()
{
    while read -e -t 0.1; do : ; done
}
    
por 17.06.2013 / 09:58
3

Coloque a tarefa demorada em um bloco cujo stdin está fechado:

{
     # time consuming task
} <&-

read -p "Give me some input: " input
    
por 04.12.2011 / 17:46
3

Com base na resposta de christophjaeger, adicionei -s para que a entrada não seja ecoada para o terminal e -n para que ela não espere por uma nova linha.

while read -r -t 0; do
    read -n 256 -r -s
done
    
por 24.02.2014 / 11:14
2
function clear_stdin()
(
    old_tty_settings='stty -g'
    stty -icanon min 0 time 0

    while read none; do :; done 

    stty "$old_tty_settings"
)

clear_stdin
    
por 16.11.2017 / 10:22