diff options
author | Antonio Ospite <ao2@ao2.it> | 2018-10-16 14:09:52 +0200 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2020-03-28 21:42:55 +0000 |
commit | 7bab7bbbfb0b8914691de08ed22a5cbda336952e (patch) | |
tree | 60eed1848000542a6f350b94a4540bbdcbe19281 | |
parent | 1285f79afbd9686c78c7815203ecbf3e87a81ff8 (diff) | |
download | klibc-7bab7bbbfb0b8914691de08ed22a5cbda336952e.tar.gz |
[klibc] dash: eval: make traps work when "set -e" is enabled
[ dash commit 06204f0c9f539fcb8cb532166656e80b81bd689a ]
When "set -e" is enabled traps are not always executed, in particular
the EXIT trap is not executed when the shell exits on an unhandled
error.
Consider the following test script:
#!/bin/dash
set -e
trap 'ret=$?; echo "EXIT: $ret"' EXIT
trap 'exit 2' HUP INT QUIT PIPE TERM
read variable
By pressing Ctrl-C one would expect the EXIT trap to be called, as it is
the case with other shells (bash, zsh), but dash does not do it.
By calling dotrap() before jumping to the exit path when checkexit is
not zero, dash behaves like other shells.
Signed-off-by: Antonio Ospite <ao2@ao2.it>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r-- | usr/dash/eval.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/usr/dash/eval.c b/usr/dash/eval.c index 01bc5234e36a89..09a5cbf117f0a1 100644 --- a/usr/dash/eval.c +++ b/usr/dash/eval.c @@ -307,11 +307,11 @@ setstatus: break; } out: + dotrap(); + if (checkexit & status) goto exexit; - dotrap(); - if (flags & EV_EXIT) { exexit: exraise(EXEXIT); |