Каково различие-a и-e в условных выражениях удара?

Так как язык стал meta пакетом,

Вы могли сначала проверить имя пакета с yum grouplist, затем проверьте, установлено ли это с yum list installed | grep XXX

Другой глупый способ проверить это,

%> export LANG=XXX; export LANGUAGE=$LANG;
%> ls some_file_does_not_exist

И Вы собираетесь получить сообщение об ошибке на желаемом языке, если пакет языка установлен.

12
31.07.2014, 21:27
3 ответа

В bash в контексте двух аргументов команда test , -a файл и -e файл совпадают. Но они имеют некоторую разницу, потому что -a также является бинарным оператором.

-e унарный определяется POSIX, а -a унарный - нет. POSIX определяет только двоичный файл -a (см. test POSIX).

POSIX определяет три аргумента поведение теста :

3 аргумента:

  • Если $ 2 является первичным двоичным кодом, выполнить двоичный тест $ 1 и 3 доллара.

  • Если $ 1 равен '!', Отмените проверку двух аргументов $ 2 и $ 3.

  • Если $ 1 - '(' и $ 3 - ')', выполнить унарный тест 2 $. В системах, которые не поддерживают параметр XSI, результаты не указаны, если $ 1 равно '(' и $ 3 равно ')'.

  • В противном случае дают неопределенные результаты.

Итак, -a также приводит к странному результату:

$ [ ! -a . ] && echo true
true

-a рассматривается как бинарный оператор в контексте трех аргументов. См. Bash FAQ, вопрос E1 . В POSIX также упоминается, что -a получено из KornShell, но позже было изменено на -e , поскольку это сбивает с толку двоичные значения -a и -a одинарный.

-e первичный, обладающий функциональностью, аналогичной предоставляемой оболочка C была добавлена, потому что она предоставляет единственный способ для оболочки сценарий, чтобы узнать, существует ли файл, не пытаясь открыть файл. Поскольку реализациям разрешено добавлять дополнительные типы файлов, переносимый скрипт не может использовать:

test -b foo -o -c foo -o -d foo -o -f foo -o -p foo

, чтобы узнать, является ли foo существующим файлом. В исторических системах BSD существование файла можно было определить с помощью:

test -f foo -o -d foo

, но не было простого способа определить, что существующий файл был обычный файл. Раннее предложение использовало KornShell -a primary (с то же значение), но это было изменено на -e, потому что были опасения по поводу высокой вероятности того, что люди перепутают -основной с бинарным оператором -a.

-a двоичный файл также помечен как устаревший, потому что он приводит к некоторому неоднозначному выражению, которое имеет более 4 аргументов. С этим выражением> 4 аргументов POSIX определяет, что результат не указан.

13
27.01.2020, 19:54

Лучший ответ, который я нашел, из вопроса StackOverflow:

-a устарел, таким образом, не перечислен в manpage for /usr/bin/test больше, но все еще в той, что для бэша. Используйте -e . Для сингл '[', bash builtin ведет себя так же, как test bash builtin, который ведет себя так же, как /usr/bin/[ и /usr/bin/test. (одна - сим-ссылка на другую). Обратите внимание, что эффект от -a зависит от на своей позиции: Если он в начале, то это означает, что файл существует . Если он в середине двух выражений это означает логические и .

[ ! -a /path ] && echo exists не работает, так как bash manual указывает на то, что -a там считается двоичным оператором и поэтому выше не анализируется как отрицать -а ... но как если "!" и "/путь" - это true (не пустой). Таким образом, Ваш скрипт всегда выводит "-a" (который фактически тесты для файлов), и "! -a", которая на самом деле является двоичной. и здесь.

Для [[, -a больше не используется в качестве двоичного файла и (&&]. там), поэтому его уникальным назначением является проверка файла там (хотя ...изгнан из страны). Значит, отрицание на самом деле делает то, что ты ожидаешь.

5
27.01.2020, 19:54

.1. Так в чем же разница между [-a $ FILE] и [-e $ FILE], если есть?

Нет никакой разницы.

В строке 505-507 в test.c версии bash 4.2.45 (1) -release :

case 'a':           /* file exists in the file system? */
case 'e':
  return (sh_stat (arg, &stat_buf) == 0);

Это означает, что нет реальной разницы между обоими флагами.

.2. Если нет реальной разницы, почему существуют два флага для одной и той же цели?

См. Ответ gnouc .

9
27.01.2020, 19:54

Теги

Похожие вопросы