В bash, с контекстом двух аргументов testкоманды, -a fileи -e fileявляются одинаковыми. Но у них есть некоторая разница, потому что -aэто также бинарный оператор.
-eунарный определяется POSIX, а -aунарный - нет. POSIX определяет только -aдвоичный файл (см. Тест POSIX).
POSIX определяет три аргумента testповедения:
3 аргумента:
Если $ 2 - двоичный первичный, выполните двоичный тест $ 1 и $ 3.
Если $ 1 равен '!', Отмените тест с двумя аргументами для $ 2 и $ 3.
Если $ 1 равен '(', а $ 3 равен ')', выполните унарный тест $ 2. В системах, которые не поддерживают параметр XSI, результаты не указываются, если $ 1 равен '(', а $ 3 равен ')'.
В противном случае выдайте неопределенные результаты.
Так -aже приводит к странному результату:
$ [ ! -a . ] && echo true
true
-aрассматривается как бинарный оператор в контексте трех аргументов. Смотрите Bash FAQ вопрос E1 . POSIX также упоминает, что -aон получен из KornShell, но позже был изменен, -eпотому что он делает путаницу между -aдвоичным и -aунарным.
Был добавлен первичный -e, обладающий аналогичными функциональными возможностями, которые предоставляет оболочка C, поскольку он предоставляет единственному способу для сценария оболочки определить, существует ли файл, не пытаясь открыть его. Поскольку реализациям разрешено добавлять дополнительные типы файлов, переносимый скрипт не может использовать:
test -b foo -o -c foo -o -d foo -o -f foo -o -p foo
чтобы узнать, является ли foo существующим файлом. В исторических системах BSD существование файла может быть определено следующим образом:
test -f foo -o -d foo
но не было простого способа определить, что существующий файл является обычным файлом. В раннем предложении использовался основной KornShell -a (с тем же значением), но он был изменен на -e, поскольку существовала обеспокоенность по поводу высокой вероятности того, что люди путают основной -a с двоичным оператором -a.
-aДвоичный файл также помечается как устаревший, поскольку он приводит к некоторому неоднозначному выражению, которое имеет более 4 аргументов. С этим> 4 аргументами выражения, POSIX определяет, что результат не указан.