Sair aguardando a entrada do usuário

1

Estou tentando implementar um tempo de espera que o usuário pode optar por pular pressionando qualquer tecla. Também não deve imprimir nada no terminal como eu estou usando para exibir uma barra de progresso. Eu estou tendo dificuldade para capturar e testar a entrada do usuário com a dificuldade adicional para ele não deve induzir mais atraso no tempo total de espera.

Aqui está o que eu tenho no momento:

read -t 0 input </dev/tty1
   if [[ $input -ne "" ]]; then
exit 0
fi

E isso está dentro de um loop que atualiza a barra de progresso. Ele não consegue adicionar mais atraso ou imprimir linhas indesejadas, mas não cumpre sua função.

-t 0 para não adicionar mais atraso

lendo de "/ dev / tty1" para não adicionar linhas indesejadas

Como posso conseguir isso?

    
por Adrien Horgnies 12.10.2016 / 23:03

2 respostas

2

Acredite ou não, é o zero que está bagunçando você. Se você alterá-lo para um número muito baixo como 0,01, ele funcionará. Você pode fazer stream ainda mais assim:

if $(read -t.01 -sn1); then exit 0; fi
    
por bashBedlam 13.10.2016 / 03:05
1

Você quer executar duas coisas em paralelo.

  1. Ler a entrada esperando 5 seg (por exemplo)
  2. Atualize a barra de progresso (mostrando que 5 segundos estão terminando)

Para conseguir isso, não coloque o comando read dentro do loop.

Em vez disso, faça algo assim:

for i in {1..10}; do sleep 0.5s; echo ${i}0; done | zenity --progress --auto-close --text="waiting for input...5sec" 2>/dev/null &  
read -t 5 asd && kill $!

(coloque as duas linhas acima em um arquivo (digamos abc.sh) e execute bash abc.sh )

Explicação:

O primeiro comando (para atualizar a barra de progresso) é enviado para o plano de fundo com & amp; . Se o comando de leitura for concluído primeiro, kill $! fechará a barra de progresso.

Nota: Verifique o Paralelo GNU . Isso ajudaria você a fazer mais coisas em paralelo.

    
por Severus Tux 13.10.2016 / 04:14