[Bug 206295] sh(1)/test(1) bug (precedence)
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Mon Sep 19 05:56:06 UTC 2016
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=206295
--- Comment #3 from nibbana at gmx.us ---
I apologize for this somewhat incorrect statement (see below):
"this bizzare behavior only applies to the -a operator, not -o"
--
the -a or -o indeed binds more strongly than the !.
This is because -a and -o are explicitly said to be "binary
primaries" and therefore '' -a ' ' matches the first case of
3 arguments and ! '' -a '' matches the first case of
4 arguments.
In bash, dash, zsh and yash, [ ! "" -a "" ] likewise
returns true.
I recommend writing [ ! "" ] && [ "" ] or
[ -z "" ] && [ -n "" ] instead.
--
Thanks for that reply: the fact that other shells do this is
important, and probably everything is working as it should,
but the manpage doesn't explain any of the logic.
The other justification is vague:
This is because -a and -o are explicitly said to be "binary
primaries" and therefore '' -a ' ' matches the first case of
3 arguments and ! '' -a '' matches the first case of
4 arguments.
'binary' only signifies that they are operators that require
two expressions and doesn't signify precedence over 'unary'
operators/primaries. Whatever the case, it's a mess:
$ [ ! "" -a "" -o ! "" -a "" ] && echo pass || echo fail
fail
Accordingly, since the manpage explicitly states that -a has higher
precedence than -o, we should have "pass -o pass" above, but we get
"fail" instead. At the very least, the manpage should state the
logic behind this ... is it:
(pass -o pass) -a fail = fail?
pass -o (pass -a fail) = fail?
--
$ [ ! "" -a "" -o 11 -a "" ] && echo pass || echo fail
fail
pass -o (pass -a fail) = ..... no, this is not correct.
(pass -o pass) -a fail = fail? -o has higher precedence than
the 2nd -a ... which violates
the specified manpage rule.
$ [ ! "" -a "" -o "" -o "" ] && echo pass || echo fail
fail
pass -o (fail -o fail) = ..... no, this is not correct.
(pass -o fail) -o fail = ..... no, this is not correct.
wtf???
$ [ ! "" -a "" -o "" -a 11 ] && echo pass || echo fail
fail
pass -o (fail -a pass) = ..... no, this is not correct.
(pass -o fail) -a pass = ..... no, this is not correct.
wtf???
Is there any good reason for this matter to be
such a mess other than "family tradition?"
Did it make code more efficient in 1975?
It appears to be intentionally broken
without any rational basis whatsoever.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list