In bash, mit Kontext von zwei Argumenten testBefehl, -a fileund -e filesind gleich. Sie haben aber einen gewissen Unterschied, da -aes sich auch um einen binären Operator handelt.
-eunary wird von POSIX definiert, -aunary jedoch nicht. POSIX definiert nur -aBinär (siehe Test POSIX).
POSIX definiert das testVerhalten von drei Argumenten :
3 Argumente:
Wenn $ 2 eine binäre Primärdatenbank ist, führen Sie den Binärtest von $ 1 und $ 3 durch.
Wenn $ 1 '!' Ist, negieren Sie den Test mit zwei Argumenten von $ 2 und $ 3.
Wenn $ 1 '(' und $ 3 ')' ist, führen Sie den unären Test von $ 2 durch. Auf Systemen, die die XSI-Option nicht unterstützen, werden die Ergebnisse nicht angegeben, wenn $ 1 '(' und $ 3 ')' ist.
Andernfalls führen Sie zu nicht spezifizierten Ergebnissen.
Das -aführt also auch zu einem seltsamen Ergebnis:
$ [ ! -a . ] && echo true
true
-awird im Kontext von drei Argumenten als binärer Operator betrachtet. Siehe Bash FAQ Frage E1 . POSIX erwähnt auch, dass -aes von KornShell stammt, aber später geändert wurde, -eweil es die Verwechslung zwischen -abinär und -aunär macht.
Das -e-Primärsystem mit ähnlichen Funktionen wie die C-Shell wurde hinzugefügt, da es die einzige Möglichkeit für ein Shell-Skript darstellt, herauszufinden, ob eine Datei vorhanden ist, ohne zu versuchen, die Datei zu öffnen. Da Implementierungen zusätzliche Dateitypen hinzufügen dürfen, kann ein portables Skript Folgendes nicht verwenden:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
um herauszufinden, ob foo eine vorhandene Datei ist. Auf historischen BSD-Systemen kann das Vorhandensein einer Datei bestimmt werden durch:
test -f foo -o -d foo
Es gab jedoch keine einfache Möglichkeit, festzustellen, ob eine vorhandene Datei eine reguläre Datei war. In einem frühen Vorschlag wurde die KornShell -a-Primärdatenbank (mit derselben Bedeutung) verwendet. Diese wurde jedoch in -e geändert, da Bedenken hinsichtlich der hohen Wahrscheinlichkeit bestehen, dass Menschen die Primärdatenbank -a mit dem Binäroperator -a verwechseln.
-abinä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.