Od man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Jaka jest więc różnica między
[ -a $FILE ]
i[ -e $FILE ]
, jeśli w ogóle? - Jeśli nie ma prawdziwej różnicy, dlaczego istnieją dwie flagi dla tego samego celu?
Odpowiedzi:
W
bash
, w kontekście dwóch argumentówtest
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 :Tak
-a
też prowadzi do dziwnych wyniku:-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
.-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.źródło
Nie ma żadnej różnicy.
Zgodnie
505-507
wtest.c
wersji bash4.2.45(1)-release
:Oznacza to, że nie ma rzeczywistej różnicy między obiema flagami.
Zobacz odpowiedź gnouca .
źródło
-a
jest to także operator boolowski (i) w bash, wydaje się, że podatne na błędy jest dodanie tego dodatkowego znaczenia, które jest całkowicie zbędne; Sądzę, że jest to bardziej związane ze zgodnością z innymi implementacjami i / lub kompatybilnością z wcześniejszymi wersjami, które nie miały-e
.-a
i-o
logiczne dla[ test ]
. Ale niektóre muszle (jakbash
) próbowały odróżnić argument od operatora, a[ test ]
wyniki były niewiarygodne. Od tego czasu POSIX wymaga, aby każda zgodna powłoka obsługiwała co najmniej 4 argumenty w[ test ]
nawiasach.Najlepsza odpowiedź, jaką znalazłem, to ta z pytania StackOverflow:
źródło