diff --git a/bin/sh/trap.c b/bin/sh/trap.c index 48aa264ffbb..3a6803b9d90 100644 --- a/bin/sh/trap.c +++ b/bin/sh/trap.c @@ -149,6 +149,7 @@ trapcmd(int argc, char **argv) { char *action; int signo; + int errors = 0; if (argc <= 1) { for (signo = 0 ; signo < sys_nsig ; signo++) { @@ -183,8 +184,10 @@ trapcmd(int argc, char **argv) } } while (*argv) { - if ((signo = sigstring_to_signum(*argv)) == -1) - error("bad signal %s", *argv); + if ((signo = sigstring_to_signum(*argv)) == -1) { + out2fmt_flush("trap: bad signal %s\n", *argv); + errors = 1; + } INTOFF; if (action) action = savestr(action); @@ -196,7 +199,7 @@ trapcmd(int argc, char **argv) INTON; argv++; } - return 0; + return errors; } diff --git a/tools/regression/bin/sh/builtins/trap3.0 b/tools/regression/bin/sh/builtins/trap3.0 new file mode 100644 index 00000000000..41bdd61747a --- /dev/null +++ b/tools/regression/bin/sh/builtins/trap3.0 @@ -0,0 +1,12 @@ +# $FreeBSD$ + +{ + trap '' garbage && exit 3 + trap - garbage && exit 3 + trap true garbage && exit 3 + trap '' 99999 && exit 3 + trap - 99999 && exit 3 + trap true 99999 && exit 3 +} 2>/dev/null +test -n "$(trap true garbage TERM 2>/dev/null || trap)" || exit 3 +exit 0