W bash
, w kontekście dwóch argumentów test
polecenia, -a file
i -e file
są takie same. Ale mają pewną różnicę, ponieważ -a
jest również operatorem binarnym.
-e
unary jest zdefiniowany przez POSIX, ale -a
unary nie jest. POSIX definiuje tylko pliki -a
binarne (patrz test POSIX).
POSIX definiuje test
zachowanie 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 -a
też prowadzi do dziwnych wyniku:
$ [ ! -a . ] && echo true
true
-a
jest uważany za operator binarny w kontekście trzech argumentów. Zobacz Bash FAQ E1 . POSIX wspomina także, że -a
jest pobierany z KornShell, ale został później zmieniony na, -e
ponieważ wprowadza zamieszanie między -a
binarnym 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.
-a
plik 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.