Em bash, com contexto de dois argumentos de testcomando -a filee -e filesão os mesmos. Mas eles têm alguma diferença, porque -atambém é um operador binário.
-eunário é definido pelo POSIX, mas -aunário não é. O POSIX define apenas -abinário (consulte o teste POSIX).
O POSIX define o testcomportamento de três argumentos :
3 argumentos:
Se $ 2 for um primário binário, execute o teste binário de $ 1 e $ 3.
Se $ 1 for '!', Negue o teste de dois argumentos de $ 2 e $ 3.
Se $ 1 é '(' e $ 3 é ')', execute o teste unário de $ 2. Em sistemas que não suportam a opção XSI, os resultados não são especificados se $ 1 for '(' e $ 3 é ')'.
Caso contrário, produza resultados não especificados.
Então -atambém leva a um resultado estranho:
$ [ ! -a . ] && echo true
true
-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 -eporque torna confuso entre -abinário e -aunário.
O primário -e, com funcionalidade semelhante à fornecida pelo shell C, foi adicionado porque fornece a única maneira de um script de shell descobrir se existe um arquivo sem tentar abri-lo. Como as implementações têm permissão para adicionar tipos de arquivos adicionais, um script portátil não pode usar:
teste -b foo -o -c foo -o -d foo -o -f foo -o -p foo
para descobrir se foo é um arquivo existente. Em sistemas BSD históricos, a existência de um arquivo pode ser determinada por:
teste -f foo -o -d foo
mas não havia uma maneira fácil de determinar se um arquivo existente era regular. Uma proposta inicial usava o KornShell -a primário (com o mesmo significado), mas isso foi alterado para -e porque havia preocupações sobre a alta probabilidade de humanos confundirem o primário -a com o operador binário -a.
-abiná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.