Что такое идентификатор токена `]`?

9

Руководство Bash говорит:

Когда используется [форма, последний аргумент команды должен быть].

$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found

Так что ]это не зарезервированное слово, не оператор и не встроенная команда.

В качестве токена, каков идентификатор токена ]? СЛОВО или ИМЯ?

Тим
источник
4
На самом деле, [это (также) самодостаточная команда: -rwxr-xr-x 1 root root 39552 3 декабря 18:14 / usr / bin / [Хотя возможно, что есть и встроенная «параллель», как для например kill. В некоторых системах testкоманда является символической ссылкой на [или наоборот. AFAIK, ]сам по себе ничего не значит, но принято «закрывать» [- но это больше по «эстетической» причине.
Баард Копперуд
5
За последние 46 лет язык оболочки рос слой за слоем, и внутренняя согласованность никогда не была приоритетом. Если вы попытаетесь принудительно вписать его в какую-либо теоретическую формально-языковую структуру, у вас будут плохие времена.
zwol
Так как [это (также) отдельная команда, она обычно получает man-страницу ... Так что попробуйте man [и / или man test( [и это testможет быть одна и та же команда).
Баард Копперуд
Попробуйте вставить ]одинарные или двойные кавычки, и вы увидите, что это не имеет значения; это просто строка
Wildcard

Ответы:

21

]дополняет [, это закрывающий знак [команды.

Как manуказывает на странице, это на самом деле аргумент [, но, как [правило, относится к нему как к концу.

Вы можете напоминать его другими шаблонами закрытия команд, например, ;в find .. exec.

heemayl
источник
Спасибо. Для чего нужен тип / идентификатор токена ]?
Тим
8
@Tim ]ничем не отличается от любого другого нормального символа в этом контексте (в качестве аргумента команды). Команда testобрабатывает это особенно, но это до команды.
Муру
6
Это просто строка, которая [выдает ошибку, если ее последний аргумент не совсем равен ].
chepner
19

Bash не обрабатывает символы [или ](сами по себе), которые отличаются от букв алфавита.

В этом случае bash видит «слово» [и ищет команду с таким именем. Если вы заглянете в свою файловую систему, вы, вероятно, обнаружите, что /bin/[(или /usr/bin/[) существует как исполняемый файл. Как это бывает, bash также предоставляет встроенную версию (для эффективности), но это только деталь реализации.

Команда [(например, исполняемый файл с таким именем) имеет правило, согласно которому последний передаваемый ей параметр должен быть, ]иначе она выдаст ошибку. Это может быть отчасти потому, что это эстетично, но также защищает вас от случайно усеченных команд, что приятно.

Тот факт, что они не являются особыми, объясняет, почему вы не можете опустить пробел до и после [или ].


Исключения :

  • Когда [и ]происходят в правильном формате в пределах того же слова, например [a-z], то , что является особенным и Подстановка правила BASh применимо.
  • [[Команда является особенной и может сделать много вещей , [не может (и параметры внутри [[ .. ]]обрабатываются по- разному, как и некоторые разрывы строк). Соответствующее ]]также является специальным, поскольку это зарезервированное для оболочки слово, которое не может быть именем команды, и завершает специальную обработку, которая следует за [[ключевым словом.
военно-картографическая служба
источник
1
@JacobKrall Это не специальный символ, как ;или >, это просто встроенная команда, как cd. В частности, если вы печатаете [x, у [него нет особого значения.
Бармар
2
@JacobKrall Это верно для всех встроенных команд. [это специальная команда , это не специальный символ .
Бармар
@ Бармар: достаточно справедливо; Я убираю свои комментарии.
Джейкоб Кралл
На самом деле ]]более особенным, чем ]. При использовании [и ]они просто слова. Если вы пропустили ]или заменили его другим словом, bash все равно будет работать [, но [выдаст ошибку. Однако [[и ]]обрабатываются специально при разборе. Если вы заменили ]]что-то еще, bash сообщит об ошибке синтаксиса. И если вы опустите ]]bash, продолжите анализ следующей строки в поисках ]].
Касперд
Ответ @kasperd скорректирован.
Ams
3

Проще говоря, чем два предыдущих ответа, ]это просто строка, которая [требуется для запуска.

Kenny
источник
1
Это похоже на комментарий ...
wizzwizz4
@ wizzwizz4, учитывая последующие вопросы от ОП в комментариях, я думаю, что эта простота именно то, что ему нужно.
Wildcard
@ Wildcard Я действительно согласен. Было что-то, что побудило меня ответить на этот вопрос, но я подумал, что он низкого качества. (Не понизить, хотя!) Я собираюсь редактировать, чтобы улучшить разметку.
wizzwizz4