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