Почему тестовая команда должна быть экранирована для ">"? - PullRequest
0 голосов
/ 28 мая 2018

С $ help test:

test: test [expr]

Оценка условного выражения.

Выход со статусом 0 (true) или 1(ложно) в зависимости от оценки EXPR.Выражения могут быть одинарными или двоичными.Унарные выражения часто используются для проверки состояния файла.Также есть строковые операторы и операторы сравнения чисел.

Я немного запутался в том, что может содержать expr.Страница справки для test указывает, что это условное выражение, состоящее из файловых, строковых или числовых операторов.Так как же оператор сравнения строк вызывает нежелательное перенаправление файлов?

$ [ "a" > "b" ]
$ ls -la 
-rw-rw-r--  1 user user     0 May 28 17:22 b

Я понимаю, что для предотвращения перенаправления мне нужно экранировать >, но я запутался почему .Я не могу поместить любую команду как expr:

$ [ echo "hello" ] 
bash: [: echo: unary operator expected

Насколько я могу понять из текста справки test оценивает только предопределенные операторы в expr - направление файла не является одним из них .test / [ предназначены только для оценки условных выражений - я ограничен только теми операторами, которые test принимает, и аргументами, которые он принимает с ними.

(Для сравнения, со следующим встроенным не возникает путаницы относительно того, что означает >, и экранирование не требуется):

$ echo $[2>1]
1

Так что интерпретирует >как переадресация означает, что нужно бежать? * 1038

1 Ответ

0 голосов
/ 28 мая 2018

test - это обычная команда, а не специальный синтаксис, и поэтому она подвергается той же обработке, что и любая другая команда.

[ "a" > "b" ]

- это просто (слишком) умный синоним для

test "a" > "b"

и, таким образом, > интерпретируется как перенаправление вывода до определения аргументов test.Точно такую ​​же команду можно написать

[ "a" ] > "b"

Чтобы оболочка не распознала > как оператор перенаправления, ее необходимо экранировать.

[ "a" \> "b" ]  # or [ "a" ">" "b" ]

Другой приведенный вами пример:$[2>1] - это специальный синтаксис (не просто встроенная команда), и поэтому он не подвергается той же обработке.$[...] является устаревшей, не документированной, формой арифметического расширения, эквивалентной $((2>1)).В качестве специального синтаксиса оболочка анализирует содержимое $[...], отличное от обычной команды.


Примечание к ].test - обычная команда, поэтому она отвечает за интерпретацию своих аргументов так, как считает нужным.Ниже приведены все синтаксически правильные:

  1. test a \> b
  2. test a \> b ]
  3. [ a \> b
  4. [ a \> b ]

Однако только 1 и 4 семантически верны.При использовании в качестве [ последний аргумент должен быть ], чтобы поддерживать иллюзию [ ... ] как просто "группирование" выражения.

$ [ a \> b
bash: [: missing `]'

При использовании в качестве test, ] вообще не является допустимой частью выражения и должно быть опущено.

$ test a \> b ]
bash: test: too many arguments
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...