In bash
, mit Kontext von zwei Argumenten test
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 :
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 -a
führt also auch zu einem seltsamen Ergebnis:
$ [ ! -a . ] && echo true
true
-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.
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.
-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.