Apologies if I'm missing something about the expected SIGINT behavior. I've read through the previous SIGINT discussions but this still seems unexpected:
$ declare -p BASH_ARGC BASH_ARGV BASH_SOURCE BASH_LINENO declare -a BASH_ARGC=() declare -a BASH_ARGV=() declare -a BASH_SOURCE=() declare -a BASH_LINENO=() $ source <(echo 'kill -INT $$') $ declare -p BASH_ARGC BASH_ARGV BASH_SOURCE BASH_LINENO declare -a BASH_ARGC=([0]="1") declare -a BASH_ARGV=([0]="/dev/fd/63") declare -a BASH_SOURCE=([0]="/dev/fd/63") declare -a BASH_LINENO=([0]="5") Additionally, FUNCNAME is not cleared in some cases: $ declare -p FUNCNAME declare -a FUNCNAME $ source <(echo 'die() { kill -INT $$; }; die') $ declare -p FUNCNAME declare -a FUNCNAME $ source <(echo 'die() { : && kill -INT $$; }; die') $ declare -p FUNCNAME declare -a FUNCNAME=([0]="source") If the sourced script is running a foreground command then these values are returned back to their initial state after the shell receives a SIGINT -- so I suspect it's possible to do the same in the cases above.