
eu tenho um bash lopp
como
#!/bin/bash
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
Eu interrompo o loop longo com uma entrada do teclado, Ctrl+C
mas Ctrl+C
simplesmente encerro o script. Estou procurando uma alternativa para continuar o ciclo atual e interromper o loop após terminar a execução STUFF
do ciclo atual.
Responder1
Uma maneira é entrar trap
no sinal Control-C e break
sair do loop
, como em:
#!/bin/bash
trap break INT
for (( c=0; c<=1000000; c++ ))
do
SOME STUFF HERE
done
echo "I have broken out of the interminably long for loop"
trap - INT
sleep 1
echo "END."
Para mais detalhes de como isso funciona, as linhas principais são:
trap break INT
e também
trap - INT
Usamos "break" para dizer ao trap que queremos executar break para interromper o loop quando o sinal INT
(interrupt, também conhecido como SIGINT
) for gerado (o que acontece quando pressionamos Ctrl + C)
Em vez de "break", poderíamos colocar comandos arbitrários do shell entre aspas, e isso será executado quando o sinal fornecido (INT no nosso caso) for gerado.
Por último, executamos trap novamente -
para restaurar o manipulador "INT" para a ação padrão.
Aqui estão mais alguns recursos para leitura adicional e exemplos:
- Artigo do Linuxjournal sobre o comando bash trapdá mais alguns exemplos de uso de armadilhas e nuances entre as diferentes opções
- Página do MIT Confluence sobre armadilhascobre shells bash e tcsh
- Guia para iniciantes sobre como usar "trap" para capturar sinais e lidar com erros em Shell Scripté uma citação extensa que mostra outros sinais enviados pelo teclado, bem como o uso de
kill -l
para mostrar todos os sinais ekill -l SIGNALNAME
encontrar seu valor numérico.