Руководство Bash говорит:
Когда используется [форма, последний аргумент команды должен быть].
$ type [
[ is a shell builtin
$ type ]
bash: type: ]: not found
Так что ]
это не зарезервированное слово, не оператор и не встроенная команда.
В качестве токена, каков идентификатор токена ]
? СЛОВО или ИМЯ?
[
это (также) самодостаточная команда: -rwxr-xr-x 1 root root 39552 3 декабря 18:14 / usr / bin / [Хотя возможно, что есть и встроенная «параллель», как для напримерkill
. В некоторых системахtest
команда является символической ссылкой на[
или наоборот. AFAIK,]
сам по себе ничего не значит, но принято «закрывать»[
- но это больше по «эстетической» причине.[
это (также) отдельная команда, она обычно получает man-страницу ... Так что попробуйтеman [
и / илиman test
([
и этоtest
может быть одна и та же команда).]
одинарные или двойные кавычки, и вы увидите, что это не имеет значения; это просто строкаОтветы:
]
дополняет[
, это закрывающий знак[
команды.Как
man
указывает на странице, это на самом деле аргумент[
, но, как[
правило, относится к нему как к концу.Вы можете напоминать его другими шаблонами закрытия команд, например,
;
вfind .. exec
.источник
]
?]
ничем не отличается от любого другого нормального символа в этом контексте (в качестве аргумента команды). Командаtest
обрабатывает это особенно, но это до команды.[
выдает ошибку, если ее последний аргумент не совсем равен]
.Bash не обрабатывает символы
[
или]
(сами по себе), которые отличаются от букв алфавита.В этом случае bash видит «слово»
[
и ищет команду с таким именем. Если вы заглянете в свою файловую систему, вы, вероятно, обнаружите, что/bin/[
(или/usr/bin/[
) существует как исполняемый файл. Как это бывает, bash также предоставляет встроенную версию (для эффективности), но это только деталь реализации.Команда
[
(например, исполняемый файл с таким именем) имеет правило, согласно которому последний передаваемый ей параметр должен быть,]
иначе она выдаст ошибку. Это может быть отчасти потому, что это эстетично, но также защищает вас от случайно усеченных команд, что приятно.Тот факт, что они не являются особыми, объясняет, почему вы не можете опустить пробел до и после
[
или]
.Исключения :
[
и]
происходят в правильном формате в пределах того же слова, например[a-z]
, то , что является особенным и Подстановка правила BASh применимо.[[
Команда является особенной и может сделать много вещей ,[
не может (и параметры внутри[[ .. ]]
обрабатываются по- разному, как и некоторые разрывы строк). Соответствующее]]
также является специальным, поскольку это зарезервированное для оболочки слово, которое не может быть именем команды, и завершает специальную обработку, которая следует за[[
ключевым словом.источник
;
или>
, это просто встроенная команда, какcd
. В частности, если вы печатаете[x
, у[
него нет особого значения.[
это специальная команда , это не специальный символ .]]
более особенным, чем]
. При использовании[
и]
они просто слова. Если вы пропустили]
или заменили его другим словом, bash все равно будет работать[
, но[
выдаст ошибку. Однако[[
и]]
обрабатываются специально при разборе. Если вы заменили]]
что-то еще, bash сообщит об ошибке синтаксиса. И если вы опустите]]
bash, продолжите анализ следующей строки в поисках]]
.Проще говоря, чем два предыдущих ответа,
]
это просто строка, которая[
требуется для запуска.источник