3

Пожалуйста, посмотрите на следующий код,

snap=snapshot.file   
touch snapshot.file-1

$ [ -a $snap-1 ] && echo yes 
yes

Для чего здесь используется команда test -a ?

Я попробовал info coreutils 'test invocation' и искал -a , но не нашел его в разделе тестов характеристик файла , а скорее в разделе связующих для теста .

Является ли такая test -a недокументированной ?

NB, Моя система - Ubuntu 13.10, и мой man test говорит GNU coreutils 8.20 Октябрь 2012 TEST(1).

3 ответа3

3

Я не уверен, почему на info странице его нет, но запуск help test в bash дает ответ:

...
    File operators:

  -a FILE        True if file exists.
...

Так что это просто тест "существования", другие права / атрибуты не проверяются.

3

Если вы запускаете test или [ в bash , то это, вероятно, встроенная версия, а не версия coreutils в /usr/bin:

$ type test
test is a shell builtin
$ type [
[ is a shell builtin

Тем не менее, похоже, что версия coreutils реализует и -a и -e с точно таким же поведением. Возможно -a не отражено в man-странице, потому что это не стандартно, так что, возможно, оно было добавлено позже, и этот человек забыл соответствующим образом обновить man-страницу. Но я не могу сказать, что знаю историю, почему это было добавлено (или даже то, что a должно быть кратким).

1

-a является оператором AND для объединения условий, поэтому следующее показывает yes, если существуют оба каталога:

[-e /root -a -e /usr] && echo yes

Использование его с одним условием, которое по умолчанию соответствует тесту на существование, похоже на сохраненное старое поведение, но я не могу найти его на старых страницах руководства.

Ссылка (прокрутите вниз после того, как info coreutils 'test invocation'):

16.3.6 Соединительные элементы для «теста»

Обычные логические связки.

`! EXPR 'True, если EXPR ложно.

EXPR1 -a EXPR2 Истинно, если EXPR1 и EXPR2 имеют значение true.

EXPR1 -o EXPR2 Истинно, если EXPR1 или EXPR2 истинно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .