Em bash
, com contexto de dois argumentos de test
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 :
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 -a
també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 -e
porque torna confuso entre -a
binário e -a
uná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.
-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.