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

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

Вы, вероятно, знаете об этомвилочная бомба:

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

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

решение1

{}

          { list; }

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

Помимо создания подоболочки, между этими двумя конструкциями есть тонкое различие по историческим причинам. Фигурные скобки — это зарезервированные слова, поэтому они должны быть отделены от списка пробелами или другими метасимволами оболочки. Скобки — это операторы, и оболочка распознает их как отдельные токены, даже если они не отделены от списка пробелами.

//источник

решение2

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

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

Связанный контент