De man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Entonces, ¿cuál es la diferencia entre
[ -a $FILE ]
y[ -e $FILE ]
, si hay alguno? - Si no hay una diferencia real, ¿por qué existen dos banderas con el mismo propósito?
Respuestas:
En
bash
, con el contexto de dos argumentostest
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:Entonces
-a
también conduce a un resultado extraño:-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.-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.fuente
No hay diferencia en absoluto.
En línea
505-507
entest.c
la versión bash4.2.45(1)-release
:Eso indica que no hay una diferencia real entre ambas banderas.
Ver la respuesta de gnouc .
fuente
-a
es un operador booleano (y) en bash, parece propenso a errores agregar este significado adicional que es completamente redundante; Supongo que está más relacionado con la compatibilidad con alguna otra implementación y / o compatibilidad con versiones anteriores que no tenían .-e
-a
y-o
booleanos para[ test ]
. Pero algunos shells (comobash
) apestaban al distinguir un argumento de un operador y los[ test ]
resultados no eran confiables. Desde entonces, POSIX ha requerido que cualquier shell compatible maneje al menos 4 argumentos dentro de los[ test ]
corchetes.La mejor respuesta que he encontrado es esta, de una pregunta de StackOverflow:
fuente