У bash, з контекстом двох аргументів testкоманда, -a fileі -e fileє однаковими. Але вони мають певну різницю, тому що -aце також двійковий оператор.
-eunary визначається POSIX, але -aunry - ні. 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 E1 . POSIX також згадує, що -aотримується від KornShell, але згодом було змінено, -eоскільки він робить заплутаним між -aбінарним та -aунарним.
Первинний -e, що володіє функціоналом, подібним до того, який надає оболонка C, був доданий, оскільки він забезпечує єдиний спосіб для скрипта оболонки з'ясувати, чи існує файл, не намагаючись відкрити файл. Оскільки реалізаціям дозволено додавати додаткові типи файлів, портативний скрипт не може використовувати:
тест -b foo -o -c foo -o -d foo -o -f foo -o -p foo
щоб з'ясувати, чи foo - це вже існуючий файл. У історичних системах BSD існування файлу можна визначити:
тест -f foo -o -d foo
але не було простого способу визначити, що існуючий файл є звичайним файлом. Рання пропозиція використовувала первинний KornShell (з тим самим значенням), але це було змінено на -e, оскільки існували занепокоєння з приводу високої ймовірності того, що люди плутають -a первинну з бінарним оператором.
-aдвійковий також позначений як застарілий, тому що це призводить до деякого неоднозначного вираження, яке має більше 4 аргументів. За допомогою цих> 4 аргументів вираз, POSIX визначає результат не визначений.