W bash, w kontekście dwóch argumentów testpolecenia, -a filei -e filesą takie same. Ale mają pewną różnicę, ponieważ -ajest również operatorem binarnym.
-eunary jest zdefiniowany przez POSIX, ale -aunary nie jest. POSIX definiuje tylko pliki -abinarne (patrz test POSIX).
POSIX definiuje testzachowanie trzech argumentów :
3 argumenty:
Jeśli 2 USD jest wartością binarną podstawową, wykonaj test binarny 1 USD i 3 USD.
Jeśli 1 $ to „!”, Zaneguj test na dwa argumenty 2 $ i 3 $.
Jeśli 1 $ to „(”, a 3 $ to ”), wykonaj test jednostronny 2 $. W systemach, które nie obsługują opcji XSI, wyniki nie są określone, jeśli 1 $ to „(” a 3 $ to ”)”.
W przeciwnym razie uzyskaj nieokreślone wyniki.
Tak -ateż prowadzi do dziwnych wyniku:
$ [ ! -a . ] && echo true
true
-ajest uważany za operator binarny w kontekście trzech argumentów. Zobacz Bash FAQ E1 . POSIX wspomina także, że -ajest pobierany z KornShell, ale został później zmieniony na, -eponieważ wprowadza zamieszanie między -abinarnym i jednostkowym -a.
-E-podstawowa, posiadająca podobną funkcjonalność do tej zapewnianej przez powłokę C, została dodana, ponieważ zapewnia ona jedyny sposób, aby skrypt powłoki sprawdził, czy plik istnieje, bez próby jego otwarcia. Ponieważ implementacje mogą dodawać dodatkowe typy plików, przenośny skrypt nie może używać:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
aby dowiedzieć się, czy foo jest istniejącym plikiem. W historycznych systemach BSD istnienie pliku można ustalić na podstawie:
test -f foo -o -d foo
ale nie było łatwego sposobu ustalenia, czy istniejący plik był zwykłym plikiem. Wczesna propozycja wykorzystywała KornShell -a pierwotny (o tym samym znaczeniu), ale zmieniono go na -e, ponieważ istniały obawy o wysokie prawdopodobieństwo, że ludzie pomylą -a pierwotną z operatorem -a binarnym.
-aplik binarny jest również oznaczony jako przestarzały, ponieważ prowadzi do niejednoznacznego wyrażenia, które ma więcej niż 4 argumenty. Przy tym wyrażeniu> 4 argumenty POSIX definiuje wynik jako nieokreślony.