[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: 'test' builtin of bash returns wrong value for '! -a FILE' operation

From: Jonathan Nieder
Subject: Re: 'test' builtin of bash returns wrong value for '! -a FILE' operation
Date: Fri, 5 Nov 2010 16:24:23 -0500
User-agent: Mutt/1.5.21 (2010-09-15)

tags 426990 - moreinfo
tags 426990 + upstream
# documentation bug
severity 426990 minor
retitle 426990 bash: "help test" gives no hint of complicated precedence rules

OZAKI Masanobu wrote:
> On Fri, 2010-11-05 at 03:17:13 -0500, Jonathan Nieder <address@hidden> wrote:

>>> Please try
>>>   % bash -c 'test ! -a . && echo true'
>>> and compare with the result of
>>>   % bash -c '/usr/bin/test ! -a . && echo true'
>> So which one is right?
> Both should echo "true", but the former did not: I found that the former
> sometimes returns the correct result, but have not found what makes the
> difference.

Thanks.  The second one doesn't echo "true", does it?

Summarizing: There are two -a operators: a unary one and a binary one.
This results in reduce/reduce conflicts when parsing a "test" expression.

"help test" says:

        See the bash manual page bash(1) for the handling of
        parameters (i.e., missing parameters).

which does not really tempt me to look at the manual.  bash(1) says:

        Expressions may be combined using the following
        operators, listed in decreasing order of precedence.

giving an order of precedence with ! before -a.  Then it quickly
corrects itself:

        test and [ evaluate conditional expressions using a set
        of rules based on the number of arguments.

                0 arguments
                        The expression is false.
                3 arguments
                        If the second argument is one of the
                        binary conditional operators listed above
                        under CONDITIONAL EXPRESSIONS, the result
                        of the expression is the result of the
                        binary test using the first and third
                        arguments as operands.  The -a and -o
                        operators are considered binary operators
                        when there are three arguments.

That answers the question.  Unfortunately, the next sentence is
inconsistent with that answer:

                                                         If the first
                        argument is !, the value is the negation of
                        the two-argument test using the second and
                        third arguments.

Suggested changes:

 1. Change the parenthesis in "help bash" to something like
    "(e.g., operator precedence and missing parameters)".

 2. Change the second paragraph in the description in bash(1) of
    the test builtin to something like

        Expressions may be combined using the following operators.
        The evaluation depends on the number of arguments; see below.
        When 5 or more arguments are present, this list is in
        decreasing order of precedence.

 3. Add the word "Otherwise," before "If the first argument is !" in
    the 3-argument case.

Thoughts?  I can try writing a patch if this looks like a good idea.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]