Определение функции оболочки: почему после открывающей скобки есть пробел?

18

Вы, наверное, знаете об этой вилке :

 :(){ :|:&};: #WARNING: harmful code

Интересно, почему для разбора необходимо включить пробел после открывающей фигурной скобки.

Benoit
источник

Ответы:

13

{}

          { list; }

Помещение списка команд в фигурные скобки приводит к тому, что список выполняется в текущем контексте оболочки. Никакая подоболочка не создана. Точка с запятой (или новая строка) следующий список обязателен.

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

// источник

порыв
источник
1
Я поспорил с твоим ответом в своем посте на этой странице. Это функция, а не группировка команд.
Успешно,
3
@donothingsuccessfully Тело функции - это группировка команд.
Жиль "ТАК - перестань быть злым"
3

Я думаю, что @rush может дать правильный, если вводит в заблуждение ответ здесь. Вилочная бомба определяет функцию под названием " :". Код в фигурных скобках не выполняется, пока функция не будет вызвана окончанием " :". Таким образом, фигурные скобки как группировка команд и фигурные скобки как тело функции синтаксически одинаковы, но имеют разную семантику.
Из того же документа, что и @rush, цитирует:

Обратите внимание, что по историческим причинам в большинстве случаев фигурные скобки, окружающие тело функции, должны быть отделены от тела пробелами или символами новой строки. Это связано с тем, что фигурные скобки являются зарезервированными словами и распознаются как таковые только в том случае, если они отделены от списка команд пробелом или другим метасимволом оболочки. Кроме того, при использовании фигурных скобок список должен заканчиваться точкой с запятой, символом «&» или переводом строки.

donothingsuccessfully
источник
3
Нет, ответ Раша правильный. Фигурные скобки вокруг тела функции - это тот же синтаксический элемент, что и в случае, когда они не разделены телом функции. Смотрите правила грамматики оболочки : a function_body- это compound_command(плюс необязательно redirect_list). Пробел необходим, потому что {это зарезервированное слово, а не специальный символ.
Жиль "ТАК - перестань быть злым"
Да, ответ Раша правильный, как я уже сказал. Да, они синтаксически одинаковы, как я уже сказал. Но они brace_groupведут себя по-разному, когда часть функции, а когда нет. Я использовал группировку команд для описания последнего случая, и это было описано в ссылке Rush.
успешно
2
Я не уверен, что семантическое различие здесь важно, поскольку синтаксический анализ имеет значение для синтаксического анализатора. Реальный ответ - {это не оператор, а зарезервированное слово, и слова должны быть отделены от других слов, чтобы считаться отличимыми.
jw013