Zsh Mailing List Archive
Messages sorted by:
Re: 4.3.4-dev-4 and 4.2.6-dev-2 available
- X-seq: zsh-users 12323
- From: Vincent Lefevre <vincent@xxxxxxxxxx>
- To: Zsh users list <zsh-users@xxxxxxxxxx>
- Subject: Re: 4.3.4-dev-4 and 4.2.6-dev-2 available
- Date: Wed, 12 Dec 2007 15:31:46 +0100
- In-reply-to: <20071212130703.5e6931dc@news01>
- Mail-followup-to: Zsh users list <zsh-users@xxxxxxxxxx>
- Mailing-list: contact zsh-users-help@xxxxxxxxxx; run by ezmlm
- References: <22582.1197372038@xxxxxxx> <20071212010837.GZ13079@xxxxxxxxxxxxxxxxxxx> <20071212130703.5e6931dc@news01>
On 2007-12-12 13:07:03 +0000, Peter Stephenson wrote:
> which is that in the traditional "test" command (not [[, which is parsed
> ( ! -e )
> should be treated as
> ( ! -n -e )
> which is horrible, but it's a horror we're already trying to work around so
> presumably we ought to go the extra mile.
No, this is not what POSIX says. See
The algorithm for determining the precedence of the operators and
the return value that shall be generated is based on the number of
arguments presented to test.
Here, there are 4 arguments. Thus the parentheses have the precedence:
* If $1 is '!', negate the three-argument test of $2, $3, and $4.
* If $1 is '(' and $4 is ')', perform the two-argument test of $2
As a consequence, this is equivalent to 'test ! -e' (2-argument test),
which corresponds to:
* If $1 is '!', exit true if $2 is null, false if $2 is not null.
> Furthermore, this change makes
> ( ! -e ) )
> an error:
Hmm... I don't think so. POSIX is a bit unclear, but its rationale
is more detailed. If you use a greedy left-to-right algorithm and
the POSIX precedence rules, this is not an error. Otherwise I don't
see how you can determine which closing parenthesis you should take
(taking the first one doesn't seem to be more intuitive than taking
the last one). Now, I can see that GNU test regards this as an
error, but it may be wrong here.
However, I don't know how this should be parsed:
-n OK -a ! ( = )
i.e. if this should be regarded as
-n OK -a ! ( <expression> )
-n OK -a ! <string> = <string>
Or things like this: -n OK -a ! = = =
> ( -e ) )
> is parsed by GNU test as -e ")" in parentheses. This is rather
> inconsistent of it.
Well, this is what POSIX (with XSI) requires: the rules are different
whether you have up to 4 arguments or more than 4 arguments. Portable
script should follow POSIX anyway. Otherwise, users should rather use
[[ ... ]]. As you said, the 'test' builtin is for compatibility.
But try the following:
/usr/bin/test -n OK -a \( -e \) \)
Here it returns the error:
/usr/bin/test: extra argument `)'
This is consistent with its parsing of "\( \! -e \) \)". I still think
that both are wrong, though.
I think the rationale behind the specific rules for up to 4 arguments
is for compatibility with historical systems, to be able to support
the implicit "-n".
> What I don't have is a set of tests: our test suite doesn't include many
> tests for test or [. This is a real nuisance, since it's quite likely this
> changes something. So I'll need to write something first (I presume no one
> else is going to).
Perhaps GNU test has a more complete test suite, at least for the
cases up to 4 arguments?
Vincent Lefèvre <vincent@xxxxxxxxxx> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)
Messages sorted by: