Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 15 Jan 2016 08:09:46 +0000
From:      Matthew Seaman <matthew@FreeBSD.org>
To:        freebsd-questions@freebsd.org
Subject:   Re: Sh-test, bug or not?
Message-ID:  <5698A94A.8040604@FreeBSD.org>
In-Reply-To: <0LwGDy-1a6CqZ3TAs-0186MD@mail.gmx.com>
References:  <0LwGDy-1a6CqZ3TAs-0186MD@mail.gmx.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--LjohoUlgWlt5HIgDPuNcQJ7R0tljmO53F
Content-Type: text/plain; charset=windows-1252
Content-Transfer-Encoding: quoted-printable

On 15/01/2016 04:32, CK wrote:
> If you have authoritative knowledge on the subject,
> please state if this functionality is correct:
>=20
> $ [ ! "" -a "" ] && echo pass || echo fail
> pass
> $ [ ! 11 -a "" ] && echo pass || echo fail
> pass
>=20
> The "-a" operator binds stronger than the "!" operator.
> Intuition based on functionality in awk/C would suppose
> that the "!" operator would bind stronger than the "-a"
> operator, especially since "-a" does in fact have higher
> precedence than the "-o" operator, as in awk/C.
>=20
> In order to make it work as "expected", it gets ugly:
>=20
> $ [ ! "" -a "" ] && echo pass || echo fail
> pass
> $ [ \( ! "" \) -a "" ] && echo pass || echo fail
> fail
>=20
> $ [ ! 11 -a "" ] && echo pass || echo fail
> pass
> $ [ \( ! 11 \) -a "" ] && echo pass || echo fail
> fail
>=20
> I never noticed this in 20 years, so I don't know if it always
> worked this way, or if something changed in my upgrade from
> 4.11 to 9.3.

I think that while unexpected in comparison to other languages which
have inherited C-like operator precedence rules, this is according to
the POSIX standard for test(1).  As the man page says:

     The test grammar is inherently ambiguous.  In order to assure a
degree of
     consistency, the cases described in the IEEE Std 1003.2 (``POSIX.2''=
),
     section D11.2/4.62.4, standard are evaluated consistently according =
to
     the rules specified in the standards document.  All other cases are
sub-
     ject to the ambiguity in the command semantics.

and it notes that the ambiguous cases are those involving (), -a and -o.

Your test might be more clearly expressed as:

$ [ ! "" ] && [ "" ] && echo pass || echo fail
fail

(although I'd recommend the -z and -n operators for testing the
emptiness / undefinedness or not of strings.)

	Cheers,

	Matthew


--LjohoUlgWlt5HIgDPuNcQJ7R0tljmO53F
Content-Type: application/pgp-signature; name="signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="signature.asc"

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

iQJ8BAEBCgBmBQJWmKlLXxSAAAAAAC4AKGlzc3Vlci1mcHJAbm90YXRpb25zLm9w
ZW5wZ3AuZmlmdGhob3JzZW1hbi5uZXQ2NTNBNjhCOTEzQTRFNkNGM0UxRTEzMjZC
QjIzQUY1MThFMUE0MDEzAAoJELsjr1GOGkAThVIP/0fVK41bLNk2MPU63G1y4Kkp
MSTogMyadziO9y8gYS4Z7e4woqPIVyJXNcEi1PydosE6ijqsEeEpW/99IjqPwnmt
t66qtqwgc1qs55KBJjOi07IVfckKfkpkSyJUDP0XUrb9gl+Cc9Wk4WUaQ7zQa36j
i/S6z6IHpwL1AtgC5iAOBrSFthtFCynCCT8ajntavNImRIdMs61Iow6tnbc2PZik
ZwVRStc2F5qJD5B/W6WqWKM794DYF80YGv+2uc64045+rVOmNVjqQPR9vf4hp+5Y
98r3/KxLEZu1x8YqfSShDDqBvgyBFImAzMg+9LX/lml4EMW9IQQaU+GlDC3Yfz/0
dfMcFBIwdUzVbcqsWuYUSFxEcC/UvxDZSaIm5/X+HWm4ve6q3f5dFtahOwL3KFhh
7d1HCv6zOJQozXqrjO1pZXEpjGUdl1pEcsYU5mzw6sAk0QFYM64zTp4hJe6mFHhy
eNC+PHilYh0bJNyahVpFvqn+CP8G2olt38EZAFNN4QozPP2xBJfmAYdqPf1PAdyH
trmqf3MPtk5jPfwtuhJpkMEMcjRgfQ1LVcvA1fM9Y1qA0npGTONUNtrsJY9wf9NB
VCdHUGNsvycYgH/1hQlMvWXPzcN5tnmVzy0QMXTbLQJIqjHlKtuMgdH62g/5OvBw
xb7KG/asHmDNJ3BcE8dJ
=Q0Ke
-----END PGP SIGNATURE-----

--LjohoUlgWlt5HIgDPuNcQJ7R0tljmO53F--



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