sh: Fix some things about -- in trap:

* Make 'trap --' do the same as 'trap' instead of nothing.
* Make '--' stop option processing (note that '-' action is not an option).

Side effect: The error message for an unknown option is different.
This commit is contained in:
Jilles Tjoelker 2011-01-15 21:09:00 +00:00
parent 951f1334b6
commit a043cc4c68
2 changed files with 33 additions and 11 deletions

View File

@ -153,8 +153,18 @@ trapcmd(int argc, char **argv)
char *action;
int signo;
int errors = 0;
int i;
if (argc <= 1) {
while ((i = nextopt("l")) != '\0') {
switch (i) {
case 'l':
printsignals();
return (0);
}
}
argv = argptr;
if (*argv == NULL) {
for (signo = 0 ; signo < sys_nsig ; signo++) {
if (signo < NSIG && trap[signo] != NULL) {
out1str("trap -- ");
@ -171,19 +181,12 @@ trapcmd(int argc, char **argv)
return 0;
}
action = NULL;
if (*++argv && strcmp(*argv, "--") == 0)
argv++;
if (*argv && sigstring_to_signum(*argv) == -1) {
if ((*argv)[0] != '-') {
if (strcmp(*argv, "-") == 0)
argv++;
else {
action = *argv;
argv++;
} else if ((*argv)[1] == '\0') {
argv++;
} else if ((*argv)[1] == 'l' && (*argv)[2] == '\0') {
printsignals();
return 0;
} else {
error("bad option %s", *argv);
}
}
while (*argv) {

View File

@ -0,0 +1,19 @@
# $FreeBSD$
set -e
trap - USR1
initial=$(trap)
trap -- -l USR1
added=$(trap)
[ -n "$added" ]
trap - USR1
second=$(trap)
[ "$initial" = "$second" ]
eval "$added"
added2=$(trap)
added3=$(trap --)
[ "$added" = "$added2" ]
[ "$added2" = "$added3" ]
trap -- - USR1
third=$(trap)
[ "$initial" = "$third" ]