Pressione qualquer tecla para pausar o shell script, pressione novamente para continuar

7

Eu escrevi um script de shell para testar uma API que copia arquivos e ecoa seu progresso depois de cada um.

Há dois segundos de suspensão entre cada cópia, então gostaria de adicionar a capacidade de pressionar qualquer tecla para pausar o script e permitir testes mais profundos. Em seguida, pressione qualquer tecla para continuar.

Como posso adicionar isso no menor número de linhas possível?

    
por blarg 26.11.2014 / 10:11

3 respostas

11

Você não precisa adicionar algo ao seu script. O shell permite essa funcionalidade.

  • Inicie seu script em um terminal.
  • Enquanto estiver em execução e bloqueando o terminal, use ctrl - z . O terminal é liberado novamente e você vê uma mensagem dizendo que o processo está parado. (Está agora no estado porcess T , parou)
  • Agora faça o que quiser. Você também pode iniciar outros processos / scripts e pará-los com ctrl - z .
  • Digite jobs no terminal ou liste todos os trabalhos interrompidos.
  • Para permitir que seu script continue, digite fg (primeiro plano). Ele retoma o trabalho novamente no grupo de processos em primeiro plano e os trabalhos continuam em execução.

Veja um exemplo:

root@host:~$ sleep 10 # sleep for 10 seconds
^Z
[1]+  Stopped                 sleep 10
root@host:~$ jobs # list all stopped jobs
[1]+  Stopped                 sleep 10
root@host:~$ fg # continue the job
sleep 10
root@host:~$ # job has finished
    
por 26.11.2014 / 10:26
6

Se você quiser apenas pausar o script enquanto permanece dentro do script, então você pode usar a leitura em vez de dormir.

Você pode usar

read -t para definir um tempo limite para ler read -n para ler um caractere (basta pressionar qualquer tecla) para continuar o script

Como você não forneceu nenhum código, abaixo está um exemplo de como ele poderia ser usado.
Se q for pressionado, read -n1 impedirá que o script continue até que uma tecla seja pressionada.
Quando uma tecla é pressionada, a verificação é redefinida e o script continua no loop normalmente.

while [[ true ]]; do
    read -t2 -n1 check
    if [[ $check == "q" ]];then
        echo "pressed"
        read -n1
        check=""
    else
        echo "not pressed"
    fi
echo "Doing Something"
done

Você também pode adicionar stty -echo ao início da seção e stty echo ao final para evitar que a digitação atrapalhe a saída da tela

    
por 26.11.2014 / 10:57
1

Com dd você pode ler com confiança um único byte de um arquivo. Com stty , você pode definir um número de bytes min para qualificar um terminal lido e um time em décimos de segundo. Combine esses dois e você pode fazer sem sleep inteiramente, eu acho, e apenas deixe o tempo limite de leitura do terminal fazer o trabalho para você:

s=$(stty -g </dev/tty)
(while stty raw -echo isig time 20 min 0;test -z "$(
dd bs=1 count=1 2>/dev/null; stty "$s")" || (exec sh)
do echo "$SECONDS:" do your stuff here maybe                             
   echo  no sleep necessary, I think                                                          
   [ "$((i+=1))" -gt 10 ] && exit                                                             
done       
) </dev/tty

Esse é um pequeno exemplo while loop que eu fiz para você experimentar. A cada dois segundos, dd expira em sua tentativa de leitura de stdin - redirecionado de /dev/tty - e% lo_de% loop loops. Isso ou while não esgotam o tempo limite porque você pressiona uma tecla - nesse caso, um shell interativo é invocado.

Aqui está uma execução de teste - os números impressos na cabeça de cada linha são o valor da variável de shell dd :

273315: do your stuff here maybe
no sleep necessary, I think
273317: do your stuff here maybe
no sleep necessary, I think
273319: do your stuff here maybe
no sleep necessary, I think
273321: do your stuff here maybe
no sleep necessary, I think
sh-4.3$ : if you press a key you get an interactive shell
sh-4.3$ : this example loop quits after ten iterations
sh-4.3$ : or if this shell exits with a non-zero exit status
sh-4.3$ : and speaking of which, to do so you just...
sh-4.3$ exit
exit
273385: do your stuff here maybe
no sleep necessary, I think
273387: do your stuff here maybe
no sleep necessary, I think
273389: do your stuff here maybe
no sleep necessary, I think
273391: do your stuff here maybe
no sleep necessary, I think
273393: do your stuff here maybe
no sleep necessary, I think
273395: do your stuff here maybe
no sleep necessary, I think
273397: do your stuff here maybe
no sleep necessary, I think
    
por 26.11.2014 / 11:36