Ele deve funcionar se você apenas trap
SIGINT
para alguma coisa. Como :
( true
).
#!/bin/sh
trap ":" INT
while sleep 10s ; do
something-that-runs-forever
done
Interromper o something...
não faz o shell sair agora, já que ele ignora o sinal. No entanto, se você ^ C o processo sleep
, ele sairá com uma falha e o loop será interrompido devido a isso. Mova o sleep
para dentro do loop ou adicione algo como || true
para evitar isso.
Observe que, se você usar trap "" INT
para ignorar completamente o sinal (em vez de atribuir um comando a ele), ele também será ignorado no processo filho, portanto, você não poderá interromper something...
. Isso é explicitamente mencionado pelo menos no manual do Bash :
If arg is the null string, then the signal specified by each sigspec is ignored by the shell and commands it invokes. [...] Signals ignored upon entry to the shell cannot be trapped or reset.