POSIX specifies that it *should* be inconsistent, i.e. the cases with 0, 1, 2, 3, and 4 args are different than the cases with 5 or more args. As always, this appears to be a historical compromise to reconcile the behavior of different shells in common cases.
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html (scroll down) Post I wrote about it here (after implementing it): http://www.oilshell.org/blog/2017/08/31.html Andy On Wed, Sep 5, 2018 at 6:45 PM Kevin Spiteri <[email protected]> wrote: > I'm not sure coreutils is consistent. > > [ ! "" -o s ] is false, so -o has higher priority than ! here, but > [ ! 1 -eq 2 -o s ] is true, so ! has higher priority than -o here. > Changing either 1 or 2 with walrus gives the integer expression expected > error. > > [ ! '"" -a "" ] is true, so -a has higher priority than ! here, but > [ s -a ! "" -a "" ] is false, so ! has higher priority than the right -a > here. > > I think the precedence should be as simple as: > 1. anything enclosed in ( ) > 2. any expression not containing !, -a, -o > 3. ! > 4. -a > 5. -o > > 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. > > Kevin > > > On Wed, Sep 5, 2018 at 3:24 PM Rob Landley <[email protected]> wrote: > >> On 09/05/2018 01:21 PM, Rob Landley wrote: >> > Ah, I remember what the big timesink for this one is: [ TEST -a TEST -o >> TEST -a >> > TEST ] needs a loop, which is reminiscent of the logic in "find" which >> meant I >> > wanted to look at the find code to see if anything there was worth >> factoring out >> > into lib so it could be shared. >> >> I should copy a bunch of the tests from "find" with regard to ! inside >> parentheses meaning something different from ! outside parentheses and >> such, I >> think I wrote about this in old mailing post lists, I should compare the >> git >> commit dates with the web archive and see what i can dig up? >> >> I left myself comments at the end of tests/test.test (what a lovely name); >> >> # test ! = -o a >> # test ! \( = -o a \) >> # test \( ! = \) -o a >> >> And I dunno what the priority of -a and -o are here: >> >> [ 1 -a "" -a "" -o 1 -a 1 ] >> >> (Let's see, find is doing something like -a chains fast forward on >> failure, and >> -o chains fast forward on success? There's conditional evaluation in find >> that >> doesn't seem to be the case here: >> >> $ test 1 -o 3 -gt walrus >> bash: test: walrus: integer expression expected >> >> Confirm ] only matters as last argument when name is [ >> >> [ ] = ] ] >> >> And of course gratuitous parentheses: >> >> [ \( 1 -lt 2 \) ] >> >> (So often coming up with the tests to run is the hard part and >> development's at >> most half the work...) >> >> Rob >> _______________________________________________ >> Toybox mailing list >> [email protected] >> http://lists.landley.net/listinfo.cgi/toybox-landley.net >> > _______________________________________________ > Toybox mailing list > [email protected] > http://lists.landley.net/listinfo.cgi/toybox-landley.net >
_______________________________________________ Toybox mailing list [email protected] http://lists.landley.net/listinfo.cgi/toybox-landley.net
