От man bash
:
CONDITIONAL EXPRESSIONS
[...]
-a file
True if file exists.
[...]
-e file
True if file exists.
- Так в чем же разница между
[ -a $FILE ]
и[ -e $FILE ]
, если таковые имеются? - Если нет реальной разницы, почему существуют два флага для одной и той же цели?
Ответы:
В
bash
, с контекстом двух аргументовtest
команды,-a file
и-e file
являются одинаковыми. Но у них есть некоторая разница, потому что-a
это также бинарный оператор.-e
унарный определяется POSIX, а-a
унарный - нет. POSIX определяет только-a
двоичный файл (см. Тест POSIX).POSIX определяет три аргумента
test
поведения:Так
-a
же приводит к странному результату:-a
рассматривается как бинарный оператор в контексте трех аргументов. Смотрите Bash FAQ вопрос E1 . POSIX также упоминает, что-a
он получен из KornShell, но позже был изменен,-e
потому что он делает путаницу между-a
двоичным и-a
унарным.-a
Двоичный файл также помечается как устаревший, поскольку он приводит к некоторому неоднозначному выражению, которое имеет более 4 аргументов. С этим> 4 аргументами выражения, POSIX определяет, что результат не указан.источник
Там нет никакой разницы вообще.
В строке
505-507
вtest.c
версии Баша4.2.45(1)-release
:Это указывает на то, что между обоими флагами нет реальной разницы.
Смотрите ответ gnouc .
источник
-a
это также логический оператор (и) в bash, кажется, что склонен к ошибкам добавить это дополнительное значение, которое является полностью избыточным; Я предполагаю, что это больше связано с совместимостью с какой-либо другой реализацией и / или совместимостью с более ранними версиями, которые не имели-e
.-a
и-o
логические значения для[ test ]
. Но некоторые оболочки (вродеbash
) не помогли отличить аргумент от оператора, и[ test ]
результаты оказались ненадежными. С тех пор POSIX требует, чтобы любая совместимая оболочка обрабатывала как минимум 4 аргумента в[ test ]
скобках.Лучший ответ, который я нашел, - это этот вопрос из вопроса StackOverflow:
источник