Есть ли существенная разница между `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.

Другие вопросы по тегам