Von man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Was ist also der Unterschied zwischen
[ -a $FILE ]
und[ -e $FILE ]
, falls vorhanden? - Wenn es keinen wirklichen Unterschied gibt, warum existieren zwei Flags für denselben Zweck?
Antworten:
In
bash
, mit Kontext von zwei Argumententest
Befehl,-a file
und-e file
sind gleich. Sie haben aber einen gewissen Unterschied, da-a
es sich auch um einen binären Operator handelt.-e
unary wird von POSIX definiert,-a
unary jedoch nicht. POSIX definiert nur-a
Binär (siehe Test POSIX).POSIX definiert das
test
Verhalten von drei Argumenten :Das
-a
führt also auch zu einem seltsamen Ergebnis:-a
wird im Kontext von drei Argumenten als binärer Operator betrachtet. Siehe Bash FAQ Frage E1 . POSIX erwähnt auch, dass-a
es von KornShell stammt, aber später geändert wurde,-e
weil es die Verwechslung zwischen-a
binär und-a
unär macht.-a
binär wird auch als veraltet markiert, da es zu einem mehrdeutigen Ausdruck führt, der mehr als 4 Argumente enthält. Mit diesem Ausdruck> 4 Argumente definiert POSIX, dass das Ergebnis nicht angegeben ist.quelle
Es gibt überhaupt keinen Unterschied.
In Zeile
505-507
intest.c
der Bash - Version4.2.45(1)-release
:Dies zeigt an, dass zwischen beiden Flags kein wirklicher Unterschied besteht.
Siehe Gnoucs Antwort.
quelle
-a
es sich auch um einen booleschen Operator (und) in bash handelt, fehleranfällig zu sein, diese zusätzliche Bedeutung hinzuzufügen, die vollständig redundant ist. Ich würde vermuten, dass dies eher mit der Kompatibilität mit einer anderen Implementierung und / oder der Kompatibilität mit früheren Versionen zusammenhängt, die dies nicht hatten-e
.-a
und-o
-Booleschen Werte für an[ test ]
. Aber einige Muscheln (wiebash
) saugten daran, ein Argument von einem Operator zu unterscheiden, und die[ test ]
Ergebnisse waren unzuverlässig. Seitdem verlangt POSIX, dass jede kompatible Shell mindestens 4 Argumente in den[ test ]
Klammern verarbeitet.Die beste Antwort, die ich gefunden habe, ist diese aus einer StackOverflow-Frage:
quelle