Який ідентифікатор токена `]`?


9

Посібник Баша говорить:

Коли використовується [форма, останнім аргументом команди має бути а].

$ 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 test( [і testможе бути однакова команда).
Бард Копперуд

Спробуйте дотримуватися ]одиничних чи подвійних лапок, і ви побачите, що це не має ніякого значення; це просто струна.
Wildcard

Відповіді:


21

]доповнює [, це знак завершення [команди.

Як manзазначає сторінка, це насправді аргумент [, але [трапляється, особливо, як до кінця.

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


Дякую. Що таке тип / ідентифікатор токена ]?
Тим

8
@Tim ]не відрізняється від будь-якого іншого нормального символу в цьому контексті (як аргумент команди). У testкоманді обробляє це спеціально, але це до команди.
муру

6
Це просто рядок, і [виникає помилка, якщо її остаточний аргумент точно не дорівнює ].
чепнер

19

Bash не позначає [або ]символи (самостійно) нічим не відрізняються від букви алфавіту.

У цьому випадку bash бачить "слово" [, і йде шукати команду з цим ім'ям. Якщо ви заглянете у свою файлову систему, ви, ймовірно, виявите, що /bin/[(або /usr/bin/[) існує як виконуваний файл. Як це буває, bash також пропонує вбудовану версію (задля ефективності), але це лише детальна інформація про реалізацію.

У [команді (як у виконуваному файлі з цим ім'ям) є правило, згідно з яким останній параметр, який ви йому передаєте, повинен бути, ]інакше він видає помилку. Це може бути частково тому, що це естетично, але воно також захищає вас від випадково врізаних команд, що приємно.

Справа в тому, що вони не є особливими , тому ви не можете опустити пробіл до і після [або після ].


Винятки :

  • Коли [і ]виникають у правильному форматі в одному слові, наприклад [a-z], тоді це особливі правила, і застосовуються правила глобального керування баша.
  • [[Команда є особливою і може зробити багато речей , [не може (і параметри всередині [[ .. ]]обробляються по- різному, як і деякі розриви рядків). Відповідне ]]також є спеціальним, оскільки це застережене для оболонки слово, яке не може бути ім'ям команди, і закінчує спеціальну обробку, яка слідує за [[ключовим словом.

1
@JacobKrall Це не особливий характер , як ;і >, це просто вбудована команда , як cd. Зокрема, якщо ви вводите [x, значення [не має особливого значення.
Вармар

2
@JacobKrall Це справедливо для всіх вбудованих команд. [це спеціальна команда , це не особливий персонаж .
Бармар

@Barmar: Досить справедливо; Я відкликаю свої коментарі.
Якоб Кралл

Насправді ]]є більш особливим, ніж ]. При використанні [і ]вони є лише словами. Якщо ви пропустили ]або замінили його іншим словом, bash все одно запуститься [, але [призведе до помилки. Однак [[і ]]обробляє спеціальні при розборі час. Якщо ви замінили ]]щось інше, bash повідомить про синтаксичну помилку. І якщо ви пропустите ]]баш, продовжуйте розбирати наступний рядок, шукаючи ]].
kasperd

@kasperd відповідь скоригована.
ams

3

Якщо говорити простіше, ніж два попередні відповіді, ]це лише рядок, який [потрібно запустити.


1
Це трохи схоже на коментар ...
wizzwizz4

@ wizzwizz4, враховуючи подальші запитання з ОП у коментарях, я думаю, що ця простота саме те, що йому потрібно.
Wildcard

@Wildcard Я дійсно згоден. Щось спокушало мене підтримати цю відповідь, але я вважав, що це низька якість. (Не звернув уваги!) Я збираюся редагувати, щоб покращити розмітку.
wizzwizz4
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.