Big bad bug: it appears that subshells always return status 0 in traps. Bug found in dash 0.5.9 and later. $ src/dash -c 'trap "(false) && echo BUG" INT; kill -s INT $$' BUG $ src/dash -c 'trap "(false) && echo BUG" EXIT' BUG $ src/dash -c 'trap "(false); echo \$?" EXIT' 0 Workaround: if an explicit 'exit' is given, it works as expected. $ src/dash -c 'trap "(false; exit \$?); echo \$?" EXIT' 1 - Martijn