Sh-test, bug or not?
Arthur Chance
freebsd at qeng-ho.org
Fri Jan 15 08:41:36 UTC 2016
On 15/01/2016 04:32, CK wrote:
> If you have authoritative knowledge on the subject,
> please state if this functionality is correct:
>
> $ [ ! "" -a "" ] && echo pass || echo fail
> pass
> $ [ ! 11 -a "" ] && echo pass || echo fail
> pass
>
> 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.
>
> In order to make it work as "expected", it gets ugly:
>
> $ [ ! "" -a "" ] && echo pass || echo fail
> pass
> $ [ \( ! "" \) -a "" ] && echo pass || echo fail
> fail
>
> $ [ ! 11 -a "" ] && echo pass || echo fail
> pass
> $ [ \( ! 11 \) -a "" ] && echo pass || echo fail
> fail
>
> 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 would never claim to be an authority, but a quick look at the test(1)
code shows that although the comments starting line 53 suggest the
grammar one would expect, there's a special case in main() for an
expression of exactly four parts starting with "!". The comment on line
218 is relevant to your tests.
217 if (nargc == 4 && strcmp(*t_wp, "!") == 0) {
218 /* Things like ! "" -o x do not fit in the normal
grammar. */
219 --nargc;
220 ++t_wp;
221 res = oexpr(t_lex(*t_wp));
222 } else
223 res = !oexpr(t_lex(*t_wp));
I presume the shells use a version of this code as well. My guess would
be that this is some sort of kludge going back to the original bourne
shell, but someone else more knowledgeable than me will have to deal
with that.
--
Moore's Law of Mad Science: Every eighteen months, the minimum IQ
necessary to destroy the world drops by one point.
More information about the freebsd-questions
mailing list