[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
quit
OZAKI Masanobu wrote:
> On Fri, 2010-11-05 at 03:17:13 -0500, Jonathan Nieder <jrnieder@gmail.com>
> 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.
- Re: 'test' builtin of bash returns wrong value for '! -a FILE' operation,
Jonathan Nieder <=