Eu tenho um script bash que
tem um loop for que itera muitas vezes e dorme entre as iterações, potencialmente por um longo tempo. Isso então
grava os resultados em um arquivo e, em seguida, termina.
Ocasionalmente, recebo o resultado de que preciso antes que muitas iterações de loop sejam concluídas.
Nessas ocasiões, preciso que o script break
saia do loop enquanto estiver
fazendo coisas, ou
adormecido
de forma que continue com o resto do script, após o loop for, que está gravando um arquivo de relatório de dados coletados até o momento.
Desejo usar uma combinação de teclas, por exemplo, CTRL+Q, para break
sair do loop for.
O script fica assim:
#!/bin/bash
for (( c=0; c<=$1; c++ ))
do
# SOME STUFF HERE
# data gathering into arrays and other commands here etc
# sleep potentially for a long time
sleep $2
done
#WRITE REPORT OUT TO SCREEN AND FILE HERE
Faz tempo que não tenho contato com esse tipo de tarefa, mas lembro que algo assim costumava funcionar:
A idéia é usar Ctrl- Cpara quebrar o loop. Este sinal (SIGINT) é capturado pelo trap, que quebra o loop e deixa o resto do script seguir.
Exemplo:
Deixe-me saber se você tiver algum problema com isso.
A maneira mais fácil é usar Ctrl+C, pois por padrão ele dá o
INT
sinal, o que faz com que a maioria dos aplicativos pare, e você pode pegá-lo no shell.Para interromper todo o loop de uma vez, você pode executá-lo em um subshell e
exit
quando interrompido. Aqui, a armadilha é definida apenas no subshell e somente ela sai.Em alguns casos é melhor ter uma solução que não interrompa "ALGUMAS COISAS AQUI", e só quebre enquanto o shellscript está esperando.
Em seguida, você pode usar o comando interno do shell
read
com algumas opções em vez desleep
.Tente este shellscript,
Você encontra detalhes sobre
read
com o comandohelp read
,