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.