Eu tenho a seguinte armadilha definida no meu script (longo):
#!/usr/bin/env bash
function continue_on_ctrl_c() {
echo "** CTRL-C trapped **"
continue # jump to the next iteration in the for loop
}
trap continue_on_ctrl_c INT
... rest of the script...
for i in several things here; do
echo "doing: $i"
find "$i" ..... | sometreatments # some of those take a long time: I wish to skip those using ctrl-C
done
Quando eu pressiono ctrl-C para "cancelar" o achado atual e pulo para o próximo, ele chama a armadilha (vejo a mensagem que a função ecoa em primeiro lugar), mas depois sai do shell script em vez de ir a próxima iteração do loop for.
# ./longscript.bash
doing: several
** CTRL-C trapped **
# #<-- ie, it exited to the prompt, instead of continuing the for loop
Considerando que em um pequeno script de "prova de conceito", ele funciona e continua até a próxima iteração.
#!/usr/bin/env bash
function continue_on_ctrl_c() {
echo "** CTRL-C trapped **"
continue # jump to the next iteration in the for loop
}
trap continue_on_ctrl_c INT
for i in 1 2 3 ; do
echo " doing: $i "
sleep 100
done
# ./continue.bash
doing: 1
** CTRL-C trapped **
doing: 2
** CTRL-C trapped **
doing: 3
** CTRL-C trapped **
#
O que devo procurar no primeiro script que o impede de continuar até a próxima iteração do loop for, mas sai (ao passo que ainda há 3 elementos a serem tratados no loop for)?
É porque quando pressiono estou em um subshell (find ... | treatement)? Mas então parece que o shell de nível superior (aquele que está iniciando o script) é o que está recebendo o ctrl-C enquanto exibe a mensagem ...
Eu estou perdido aqui ...