De man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Então, qual é a diferença entre
[ -a $FILE ]
e[ -e $FILE ]
, se houver? - Se não há diferença real, por que existem duas bandeiras para o mesmo objetivo?
Respostas:
Em
bash
, com contexto de dois argumentos detest
comando-a file
e-e file
são os mesmos. Mas eles têm alguma diferença, porque-a
também é um operador binário.-e
unário é definido pelo POSIX, mas-a
unário não é. O POSIX define apenas-a
binário (consulte o teste POSIX).O POSIX define o
test
comportamento de três argumentos :Então
-a
também leva a um resultado estranho:-a
é considerado como operador binário no contexto de três argumentos. Consulte a pergunta E1 da FAQ do Bash . O POSIX também menciona que-a
é obtido do KornShell, mas foi alterado posteriormente para-e
porque torna confuso entre-a
binário e-a
unário.-a
binário também é marcado como obsoleto, porque leva a alguma expressão ambígua, com mais de 4 argumentos. Com essa expressão> 4 argumentos, o POSIX define que o resultado não é especificado.fonte
Não há nenhuma diferença.
Em linha
505-507
notest.c
da versão do bash4.2.45(1)-release
:Isso indica que não há diferença real entre os dois sinalizadores.
Veja a resposta do gnouc .
fonte
-a
é um operador booleano (e) no bash, parece propenso a erros adicionar esse significado adicional que é completamente redundante; Eu acho que está mais relacionado à compatibilidade com alguma outra implementação e / ou compatibilidade com versões anteriores que não tinham .-e
-a
e-o
booleanos para[ test ]
. Porém, algumas conchas (comobash
) foram úteis para distinguir um argumento de um operador e os[ test ]
resultados não eram confiáveis. Desde então, o POSIX exigiu que qualquer shell compatível lide com pelo menos 4 argumentos entre[ test ]
colchetes.A melhor resposta que encontrei é esta, de uma pergunta do StackOverflow:
fonte