shell 'trap' woodoo :)

Cristian Ionescu-Idbohrn cristian.ionescu-idbohrn at axis.com
Sun Sep 12 17:09:11 UTC 2010


On Sun, 12 Sep 2010, Denys Vlasenko wrote:

> On Sat, Sep 11, 2010 at 9:31 PM, Cristian Ionescu-Idbohrn
> <cristian.ionescu-idbohrn at axis.com> wrote:
> > This test script:
> >
> > ---8<---
> > #!/bin/sh
> >
> > set -e
> > set -u
> > #set -x
> >
> > trap 'wrapper_func' EXIT TERM INT
> >
> > other_func() {
> >        echo "in : other_func" >&2
> > # XXX:  if this doesn't fail, the expected exit status comes out after 'trap'
> > #       but, if it _does_ fail, the exit status of the failed command will
> > #       be returned, as errexit will step in.
> >        ls -al /foo/bar/baz || :
> >        echo "out: other_func" >&2
> > }
> >
> > wrapper_func() {
> >        echo "in : wrapper_func" >&2
> >        date +%s >/dev/null
> >        echo "1. : wrapper_func: listing traps" >&2
> >        trap
> >        echo "2. : wrapper_func: removing traps" >&2
> >        trap - EXIT INT TERM
> >        echo "3. : wrapper_func: listing traps again" >&2
> >        trap
> >        other_func
> >        echo "out: wrapper_func" >&2
> > }
> >
> > echo "running: $0" >&2
> > sleep 5
> >
> > exit 77
> > --->8---
> >
> > does not behave as expected if the shell is ash, hush or dash.
>
> Care to describe the symptoms?
>
> So far I see that hush simply don't support set -e and set -u,

Don't focus on that.  That's not a bug.  It's unimplemented features.

> and clears EXIT trap in tha handler. Second problem is fixed by:
>
> http://git.busybox.net/busybox/commit/?id=a110c90de2f56bf38de30972813f012d44042cb9

Great!

> > Bash on
> > debian unstable:
> >
> >        GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
> >        Copyright (C) 2009 Free Software Foundation, Inc.
> >        License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
> >
> > does TRT, though.
> >
> > All shells run the trap action twice when hitting C-c with trap on INT.
> > With signals removed in the trap action, only bash behaves, according to
> > my experiments.
>
> # sh --version
> GNU bash, version 4.1.7(1)-release (x86_64-redhat-linux-gnu)
>
> # sh z
> running: z
> ^Cin : wrapper_func
> 1. : wrapper_func: listing traps
> trap -- 'wrapper_func' EXIT
> trap -- 'wrapper_func' INT
> trap -- 'wrapper_func' TERM
> 2. : wrapper_func: removing traps
> 3. : wrapper_func: listing traps again
> in : other_func
> ls: cannot access /foo/bar/baz: No such file or directory
> out: other_func
> out: wrapper_func

I run the test with 'busybox_unstripped', not 'busybox'.  Can that explain
the difference?

> # ./busybox hush z
> hush: set: -e: invalid option
> hush: set: -u: invalid option
> running: z
> ^C
> in : wrapper_func
> 1. : wrapper_func: listing traps
> trap -- 'wrapper_func' EXIT
> trap -- 'wrapper_func' INT
> trap -- 'wrapper_func' TERM
> 2. : wrapper_func: removing traps
> 3. : wrapper_func: listing traps again
> in : other_func
> ls: cannot access /foo/bar/baz: No such file or directory
> out: other_func
> out: wrapper_func
>
> hush seems to be ok.
>
> # ./busybox ash z
> running: z
> ^Cin : wrapper_func
> in : wrapper_func
> 1. : wrapper_func: listing traps
> trap -- 'wrapper_func' INT
> trap -- 'wrapper_func' TERM
> 2. : wrapper_func: removing traps
> 3. : wrapper_func: listing traps again
> in : other_func
> ls: cannot access /foo/bar/baz: No such file or directory
> out: other_func
> out: wrapper_func
> 1. : wrapper_func: listing traps
> 2. : wrapper_func: removing traps
> 3. : wrapper_func: listing traps again
> in : other_func
> ls: cannot access /foo/bar/baz: No such file or directory
> out: other_func
> out: wrapper_func
>
> ash seems to be buggy (enters into a trap despite it being cleared).

Don't we all know that? Dash is also buggy, bash too, and hush is not
ready yet :(

No criticism here.  I really _do_ appreciate your work.  IMO, there's no
"right" or "wrong".  There's only "frustration", "insufficient" and
"usable".

> Did I miss something?

Don't know :(  Did you?

I _think_ I can imagine how frustrating it may be for you to maintain code
you did not write yourself.  Still, untill 'hush' is up to par, 'ash'
_needs_ maintenance.  All too many projects depend on it!  It's more work
for you, I _do_ see that, but it's also, IMO, a recognition you're doing a
terribly good job!  Thanks for that.


Cheers,

-- 
Cristian


More information about the busybox mailing list