[comp.unix.sysv386] trap 0 in /bin/sh

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.