On Mon, Nov 18, 2024 at 11:31:25 +0000, Klüver, Tibor wrote:
>         Built-in `[ -a ... ]` returns true when false, negation with `!` is 
> also very strange.
>         `[[` is not affected, neither is `/bin/[`.
> 
> Repeat-By:
>         * touch file
>         * [ -a file ] && echo exists         => exists
>         * [ ! -a file ] && echo exists       => exists

The -a operator has two separate meanings in the test command.
It can either be "unary" (taking one argument), in which case it's
a synonym for -e.  Or it can be "binary" (taking two arguments),
in which case it's meant to sit in between two other expressions,
and is treated as a Logical AND.

The more complex your test expression becomes, the more likely it is
that the parser will fail to guess your intention, and will use the
other meaning of -a.

Your best bet is simply to *never* use it.  It's a daft synonym for -e,
so if you want to test for file existence, use -e.  If you want a
Logical AND between two test expressions, simply call test twice:

    [ "$x" ] && [ "$y" ]

This avoids all of the problems with -a.

Reply via email to