Em bash
, com contexto de dois argumentos test
comando, -a file
e -e file
são iguais. Mas eles têm alguma diferença, porque -a
também é um operador binário.
-e
unary é definido por POSIX, mas -a
unary não é. POSIX só define -a
binário (veja teste POSIX).
POSIX define três argumentos test
behavior:
3 arguments:
If $2 is a binary primary, perform the binary test of $1 and $3.
If $1 is '!', negate the two-argument test of $2 and $3.
If $1 is '(' and $3 is ')', perform the unary test of $2. On systems that do not support the XSI option, the results are unspecified if $1 is '(' and $3 is ')'.
Otherwise, produce unspecified results.
Portanto, -a
também leva a resultados estranhos:
$ [ ! -a . ] && echo true
true
-a
é considerado como operador binário no contexto de três argumentos. Consulte a pergunta sobre perguntas frequentes E1 .
O POSIX também menciona que -a
é obtido do KornShell, mas foi alterado posteriormente para -e
porque confunde entre -a
binary e -a
unary.
The -e primary, possessing similar functionality to that provided by the C shell, was added because it provides the only way for a shell script to find out if a file exists without trying to open the file. Since implementations are allowed to add additional file types, a portable script cannot use:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
to find out if foo is an existing file. On historical BSD systems, the existence of a file could be determined by:
test -f foo -o -d foo
but there was no easy way to determine that an existing file was a regular file. An early proposal used the KornShell -a primary (with the same meaning), but this was changed to -e because there were concerns about the high probability of humans confusing the -a primary with the -a binary operator.
-a
binary também é marcado como obsoleto, porque leva a alguma expressão ambígua, que possui mais de 4 argumentos. Com essa expressão de argumentos do > 4, o POSIX define que o resultado não é especificado.