Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Nov 2014 14:42:30 +0100
From:      Fabian Keil <freebsd-listen@fabiankeil.de>
To:        Eric van Gyzen <eric@vangyzen.net>
Cc:        Freebsd current <freebsd-current@freebsd.org>
Subject:   Re: sh: "local" assignment from command loses exit status
Message-ID:  <63396928.4e2735a2@fabiankeil.de>
In-Reply-To: <545BB08D.4020402@vangyzen.net>
References:  <545BADDE.5050605@vangyzen.net> <74dd7d12.793ea654@fabiankeil.de> <545BB08D.4020402@vangyzen.net>

next in thread | previous in thread | raw e-mail | index | archive | help
--Sig_/b/5uYkxMzcmbV0TC=/jDNh8
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: quoted-printable

Eric van Gyzen <eric@vangyzen.net> wrote:

> On 11/06/2014 12:30, Fabian Keil wrote:
> > Eric van Gyzen <eric@vangyzen.net> wrote:
> >
> >> In sh, if I use a single statement to declare a local variable and
> >> assign the output of a command to it, the exit status of that command =
is
> >> lost.  For example:
> >>
> >>     should_return_false() {
> >>         local var1=3D`false`
> >>     }
> >>
> >> The function should return non-zero, but it returns zero.
> > The function should return the return code of the last command.
> > In your example, the last command is "local".
>=20
> Fair enough.  What about errexit?  The shell ran a command whose exit
> status was not tested, that status was failure, yet the shell did not exi=
t.

That's unrelated to the "local", though. Compare:

fk@r500 ~ $sh -e -c 'true `false; echo "Not reached"`; echo Reached'
Reached

While it's not obvious from the man page[1], my assumption is that this
is intentional behaviour. The return code of the command substitution
subshell can't be checked in the parent shell, as $? belongs to the
command that gets the output as argument (in your case "local"),
thus counting this as an untested return code would be inconvenient.

Fabian

[1] It could be argued that the behaviour is documented as
"-e ... tends to behave in unexpected ways", though ...

--Sig_/b/5uYkxMzcmbV0TC=/jDNh8
Content-Type: application/pgp-signature
Content-Description: OpenPGP digital signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iEYEARECAAYFAlRczEYACgkQBYqIVf93VJ0bWQCgpOk34LB5cg7Js/FNCvyrW2/v
OSwAnAqTxfXWDLsxXeZtidfW6KIjsm1J
=YS98
-----END PGP SIGNATURE-----

--Sig_/b/5uYkxMzcmbV0TC=/jDNh8--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?63396928.4e2735a2>