Eu tenho o seguinte script bash:
# do some time consuming task here
read -p "Give me some input: " input
Agora, como você deve ter adivinhado, se um usuário pressionar algumas teclas aleatórias durante a "tarefa demorada", a entrada indesejada será levada em consideração também. Como limpo stdin
(ou pelo menos o ignoro) antes de emitir o comando de leitura?
Respostas:
Eu não acho que exista uma maneira de limpar o stdin, mas (com o bash) você pode ler e descartar o que há antes de solicitar a entrada
Ele lê stdin e tem um tempo limite de 1 segundo, mas falha se houver mais de 10000 caracteres no stdin. Não sei quão grande você pode criar o parâmetro nchars.
fonte
No Bash 4, você pode definir
-t
(tempo limite) para0
. Nesse caso,read
retorna imediatamente com um status de saída indicando se há dados aguardando ou não:fonte
Isso lê várias linhas de entradas, se o usuário pressionar inadvertidamente a tecla Enter várias vezes.
fonte
Isto funcionou bem para mim:
fonte
-e
neste caso?Coloque a tarefa demorada em um bloco cujo stdin está fechado:
fonte
read
ainda lerá a primeira linha inserida durante a# time consuming
tarefa. Além disso, se o script não contiver nenhum comando que leia stdin após oread
, as linhas não lidas serão executadas no terminal interativo após o término do script. Alguém testou isso com sucesso?Com base na resposta do christophjaeger, acrescentei
-s
para que a entrada não ecoasse no terminal e-n
não esperasse por uma nova linha.fonte
-n
é uma boa ideia, mas duas respostas anteriores já a mencionaram. E, como o objetivo deste exercício é ler e descartar tudo o que foi digitado antes daread
execução , não entendo o que você acha que-s
vai fazer.fonte