Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Dec 2011 13:36:36 -0800
From:      Devin Teske <devin.teske@fisglobal.com>
To:        "'Maxim Khitrov'" <max@mxcrypt.com>, "'FreeBSD'" <freebsd-questions@freebsd.org>
Subject:   RE: Unexpected sh behavior with EXIT trap and errexit
Message-ID:  <029f01ccc4df$9cca8190$d65f84b0$@fisglobal.com>
In-Reply-To: <CAJcQMWcR9dUqv5fUifEk7r0qN55RJvTnoX2Os3NQqHaghtZ9QA@mail.gmail.com>
References:  <CAJcQMWcR9dUqv5fUifEk7r0qN55RJvTnoX2Os3NQqHaghtZ9QA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
> -----Original Message-----
> From: owner-freebsd-questions@freebsd.org [mailto:owner-freebsd-
> questions@freebsd.org] On Behalf Of Maxim Khitrov
> Sent: Tuesday, December 27, 2011 12:25 PM
> To: FreeBSD
> Subject: Unexpected sh behavior with EXIT trap and errexit
>=20
> Can anyone explain this behavior (FreeBSD 9.0-RC3 amd64):
>=20
> Script:
> ----
> #!/bin/sh
>=20
> cleanup()
> {
>     echo 'first'
>     echo 'second'
> }
>=20
> fail() { return 42; }
>=20
> trap cleanup EXIT
> set -o errexit
> fail
> ----
>=20
> Output:
> ----
> first
> ----
>=20

If you change to:

fail() { false; }

Then the outcome is what you expect (both lines come out).

ASIDE: It appears that it's nothing to do with echo, stdout, or anything ot=
her than the fact that only the first command of the cleanup routine is cal=
led.

>From sh(1) regarding errexit:

"If a shell function is executed and its exit status is explicitly tested, =
all commands of the function are considered to be tested as well."

The exact meaning of which escapes me at the moment, but I'm lead to believ=
e that this explanation somehow plays a role in what we're witnessing with =
your sample.

It may be a bug, it may not. What's interesting in the sample is that the "=
return 42" is a valid command that succeeds while the function itself does =
not.

HTH,
Devin


> Now comment out 'set -o errexit', replace 'fail' with 'fail || exit'
> (which should be equivalent to using errexit), and run again.
>=20
> Output:
> ----
> first
> second
> ----
>=20
> Am I doing something stupid or is this a bug? Bash prints out the same
> (second) output for both versions of the code.
>=20
> - Max
> _______________________________________________
> freebsd-questions@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-questions
> To unsubscribe, send any mail to "freebsd-questions-unsubscribe@freebsd.o=
rg"

_____________
The information contained in this message is proprietary and/or confidentia=
l. If you are not the intended recipient, please: (i) delete the message an=
d all copies; (ii) do not disclose, distribute or use the message in any ma=
nner; and (iii) notify the sender immediately. In addition, please be aware=
 that any message addressed to our domain is subject to archiving and revie=
w by persons other than the intended recipient. Thank you.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?029f01ccc4df$9cca8190$d65f84b0$>