a() { (exit 2) echo a:$? (kill -s USR1 $$; echo b:$?; exit 3) echo c:$? # does not execute (exit 4) } trap "echo Trap; return" USR1 a echo d:$? # It's debatable what is the correct value above. # Does 'return' in trap see $? == 2 or $? == 3? # IOW: after (kill..), does shell first wait for its completion # and sets $?, then checks pending signals and runs a trap handler, # or does it first check pending signals and runs handler? # hush does the former, and prints 3.