В 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 определяет, что результат не указан.