ronald@robobar.co.uk (Ronald S H Khoo) (03/27/91)
Can someone explain why these two commands give different output ? Is there some subtlety about the "trap" command that I don't understand ? $ ( trap 'echo foo' 0 ; true ) $ ( trap 'echo foo' 0 ; : ) foo I tried this using /bin/sh on SCO Xenix, SCO Unix (orig release) and GEC UX/63 (SVR2, I think) and SunOS 4.1. Yes, I know they're all System V /bin/sh, but I don't have a BSD handy to try. -- Ronald Khoo <ronald@robobar.co.uk> +44 81 991 1142 (O) +44 71 229 7741 (H)
eric@mks.mks.com (Eric Gisin) (03/29/91)
In article <1991Mar27.153352.4421@robobar.co.uk> ronald@robobar.co.uk (Ronald S H Khoo) writes:
Can someone explain why these two commands give different output ?
Is there some subtlety about the "trap" command that I don't understand ?
$ ( trap 'echo foo' 0 ; true )
$ ( trap 'echo foo' 0 ; : )
foo
There is a bug in the shell.
When the last command in the list is executable (true is, : is not),
the shell tries to be clever and just does exec instead of fork/exec.
Since the shell exec()s instead of exit()s, the EXIT trap is not run.
You can work around it by putting an extra : at the end of the list:
$ ( trap 'echo foo' 0 ; true; : )
foo
I tried this using /bin/sh on SCO Xenix, SCO Unix (orig release) and
GEC UX/63 (SVR2, I think) and SunOS 4.1. Yes, I know they're all System V
/bin/sh, but I don't have a BSD handy to try.