En bash
, con el contexto de dos argumentos test
comando, -a file
y -e file
son los mismos. Pero tienen alguna diferencia, porque -a
también es un operador binario.
-e
POSARIO define unario, pero -a
no lo es unario. POSIX solo define -a
binarios (Ver prueba POSIX).
POSIX define tres argumentos de test
comportamiento:
3 argumentos:
Si $ 2 es un primario binario, realice la prueba binaria de $ 1 y $ 3.
Si $ 1 es '!', Niegue la prueba de dos argumentos de $ 2 y $ 3.
Si $ 1 es '(' y $ 3 es ')', realice la prueba unaria de $ 2. En los sistemas que no admiten la opción XSI, los resultados no se especifican si $ 1 es '(' y $ 3 es ')'.
De lo contrario, producir resultados no especificados.
Entonces -a
también conduce a un resultado extraño:
$ [ ! -a . ] && echo true
true
-a
se considera como operador binario en el contexto de tres argumentos. Consulte la pregunta frecuente Bash E1 . POSIX también menciona que -a
se obtiene de KornShell, pero se cambió más tarde -e
porque es confuso entre -a
binario y -a
unario.
El -e primario, que posee una funcionalidad similar a la proporcionada por el shell C, se agregó porque proporciona la única forma para que un script de shell descubra si existe un archivo sin intentar abrir el archivo. Dado que las implementaciones pueden agregar tipos de archivos adicionales, un script portátil no puede usar:
prueba -b foo -o -c foo -o -d foo -o -f foo -o -p foo
para averiguar si foo es un archivo existente. En sistemas BSD históricos, la existencia de un archivo podría determinarse por:
prueba -f foo -o -d foo
pero no había una manera fácil de determinar que un archivo existente era un archivo normal. Una propuesta inicial usaba el KornShell -a primario (con el mismo significado), pero esto se cambió a -e porque había dudas sobre la alta probabilidad de que los humanos confundan el operador -a primario con el operador binario -a.
-a
binario también se marca como obsoleto, porque conduce a una expresión ambigua, que tiene más de 4 argumentos. Con esta expresión de> 4 argumentos, POSIX define que el resultado no está especificado.