Есть ли существенная разница между `if [ -a FILE ]` и `if [ -e FILE ]`
Я только хочу проверить в bash, если существует определенный ФАЙЛ.
На этой странице указаны два варианта использования с if
:
[ -a FILE ]
- Истина, если ФАЙЛ существует[ -e FILE ]
- Истина, если ФАЙЛ существует
Они эквивалентны или есть какая-то разница между ними?
1 ответ
Что -a делает и почему оно существует?
-a
вариант это то же самое, что -e
и существует для совместимости с Korn Shell, у которой Bash позаимствовал множество функций.
Из стандарта POSIX, описание test
команда ( ссылка):
В раннем предложении использовался основной KornShell -a (с тем же значением), но он был изменен на -e, поскольку существовала обеспокоенность по поводу высокой вероятности того, что люди перепутают основной -a с двоичным оператором -a.
примечание стороны: бинарный означает флаг, который появляется между двумя переменными [ $var1 -a $var2 ]
, первичное означает, что сначала появляется в списке аргументов, как в [ -a $var ]
На самом деле Корн Шелл (ksh93
здесь) руководство гласит:
-файл
То же, что и -е ниже. Это устарело.
test
Команда, которая используется в статье TLDP, на которую вы ссылаетесь, использует встроенную bash test
Однако опция также присутствует в /usr/bin/test
несмотря на отсутствие в документации:
$ /usr/bin/test -a /etc/passwd && echo 1
1
Если функциональность одинакова, то стоит ли ее использовать?
Если вы на 100% уверены, что ваши скрипты будут использоваться в Bash или Korn Shell - тогда да, все в порядке. Однако, если вы стремитесь к переносимости своих сценариев и хотите написать сценарий Right WayTM, вам следует использовать -e
, Стандартная оболочка Ubuntu, /bin/sh
На самом деле это Dash - Debian Amquist Shell - не распознает этот параметр как допустимый:
$ dash
$ test -a /etc/passwd
dash: 1: test: -a: unexpected operator
В случаях, когда вы хотите портировать ваш скрипт на другие платформы, используйте -a
не гарантируется безопасность с /usr/bin/test
а также, и вы должны придерживаться -e
потому что это на самом деле указано в стандарте POSIX.