<div dir="ltr">I'm not sure coreutils is consistent.<div><br></div><div>[ ! "" -o s ] is false, so -o has higher priority than ! here, but</div><div>[ ! 1 -eq 2 -o s ] is true, so ! has higher priority than -o here.</div><div>Changing either 1 or 2 with walrus gives the integer expression expected error.</div><div><br></div><div>[ ! '"" -a "" ] is true, so -a has higher priority than ! here, but</div><div>[ s -a ! "" -a "" ] is false, so ! has higher priority than the right -a here.</div><div><br></div><div>I think the precedence should be as simple as:</div><div>1. anything enclosed in ( )</div><div>2. any expression not containing !, -a, -o</div><div>3. !</div><div>4. -a</div><div>5. -o</div><div><br></div><div>Of course, matching coreutils is more important than matching what I think. But I'm not sure how to get a consistent set of rules short of reading the code and mirroring it.</div><div><br></div><div>Kevin</div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Sep 5, 2018 at 3:24 PM Rob Landley <<a href="mailto:rob@landley.net">rob@landley.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On 09/05/2018 01:21 PM, Rob Landley wrote:<br>
> Ah, I remember what the big timesink for this one is: [ TEST -a TEST -o TEST -a<br>
> TEST ] needs a loop, which is reminiscent of the logic in "find" which meant I<br>
> wanted to look at the find code to see if anything there was worth factoring out<br>
> into lib so it could be shared.<br>
<br>
I should copy a bunch of the tests from "find" with regard to ! inside<br>
parentheses meaning something different from ! outside parentheses and such, I<br>
think I wrote about this in old mailing post lists, I should compare the git<br>
commit dates with the web archive and see what i can dig up?<br>
<br>
I left myself comments at the end of tests/test.test (what a lovely name);<br>
<br>
# test ! = -o a<br>
# test ! \( = -o a \)<br>
# test \( ! = \) -o a<br>
<br>
And I dunno what the priority of -a and -o are here:<br>
<br>
[ 1 -a "" -a "" -o 1 -a 1 ]<br>
<br>
(Let's see, find is doing something like -a chains fast forward on failure, and<br>
-o chains fast forward on success? There's conditional evaluation in find that<br>
doesn't seem to be the case here:<br>
<br>
$ test 1 -o 3 -gt walrus<br>
bash: test: walrus: integer expression expected<br>
<br>
Confirm ] only matters as last argument when name is [<br>
<br>
[ ] = ] ]<br>
<br>
And of course gratuitous parentheses:<br>
<br>
[ \( 1 -lt 2 \) ]<br>
<br>
(So often coming up with the tests to run is the hard part and development's at<br>
most half the work...)<br>
<br>
Rob<br>
_______________________________________________<br>
Toybox mailing list<br>
<a href="mailto:Toybox@lists.landley.net" target="_blank">Toybox@lists.landley.net</a><br>
<a href="http://lists.landley.net/listinfo.cgi/toybox-landley.net" rel="noreferrer" target="_blank">http://lists.landley.net/listinfo.cgi/toybox-landley.net</a><br>
</blockquote></div>