Primeiro, exit 130
não é uma saída anormal. É uma saída normal, com status de saída 130. Como pode ser visto em man 3 wait
(POSIX):
If the information pointed to by stat_loc was stored by a call to
waitpid() that specified the WUNTRACED and WCONTINUED flags,
exactly one of the macros WIFEXITED(*stat_loc), WIFSIGNALED(*stat_loc),
WIFSTOPPED(*stat_loc), and WIFCONTINUED(*stat_loc) shall evaluate to
a non-zero value.
WIFEXITED
verifica a saída normal e WIFSIGNALLED
é a finalização devido a um sinal não detectado. Como esses são mutuamente exclusivos, um exit 130
é normal.
O status de saída é 130 quando um processo é encerrado por SIGINT é porque o bash o configura como 130 fora do processo porque detectou uma saída devido a SIGINT: Por que o bash define $? (status de saída) para diferente de zero em Ctrl-C ou Ctrl-Z?
Em segundo lugar, um processo que manipula SIGINT e depois morre deve se matar com SIGINT. O wiki de Greg (um excelente recurso para shell) tem uma nota sobre isso :If you choose to set up a handler for SIGINT (rather than using the EXIT trap), you should be aware that a process that exits in response to SIGINT should kill itself with SIGINT rather than simply exiting, to avoid causing problems for its caller. Thus:
trap 'rm -f "$tempfile"; trap - INT; kill -INT $$' INT
Agora, se você alterou o exit 130
para:
trap - INT
kill -INT $$
Você veria o comportamento esperado.