test
- это обычная команда, а не специальный синтаксис, и поэтому она подвергается той же обработке, что и любая другая команда.
[ "a" > "b" ]
- это просто (слишком) умный синоним для
test "a" > "b"
и, таким образом, >
интерпретируется как перенаправление вывода до определения аргументов test
.Точно такую же команду можно написать
[ "a" ] > "b"
Чтобы оболочка не распознала >
как оператор перенаправления, ее необходимо экранировать.
[ "a" \> "b" ] # or [ "a" ">" "b" ]
Другой приведенный вами пример:$[2>1]
- это специальный синтаксис (не просто встроенная команда), и поэтому он не подвергается той же обработке.$[...]
является устаревшей, не документированной, формой арифметического расширения, эквивалентной $((2>1))
.В качестве специального синтаксиса оболочка анализирует содержимое $[...]
, отличное от обычной команды.
Примечание к ]
.test
- обычная команда, поэтому она отвечает за интерпретацию своих аргументов так, как считает нужным.Ниже приведены все синтаксически правильные:
test a \> b
test a \> b ]
[ a \> b
[ a \> b ]
Однако только 1 и 4 семантически верны.При использовании в качестве [
последний аргумент должен быть ]
, чтобы поддерживать иллюзию [ ... ]
как просто "группирование" выражения.
$ [ a \> b
bash: [: missing `]'
При использовании в качестве test
, ]
вообще не является допустимой частью выражения и должно быть опущено.
$ test a \> b ]
bash: test: too many arguments