Визначення функції оболонки: чому після відкривання дужки залишається пробіл?


18

Ви, мабуть, знаєте про вилкову бомбу :

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

Цікаво, чому потрібно для її розбору включити пробіл після відкриття фігурної дужки.

Відповіді:


13

{}

          { list; }

Розміщення списку команд між фігурними дужками призводить до того, що список виконується в поточному контексті оболонки. Не створено підкашлю. Наступний список з комою (або новим рядком) обов'язковий.

Окрім створення нижньої оболонки, існує двозначна різниця між цими двома конструкціями через історичні причини. Дужки є зарезервованими словами, тому вони повинні бути відокремлені від списку пробілами або іншими метахарактерами оболонок. Дужки є операторами і оболонкою розпізнаються як окремі лексеми, навіть якщо вони не відокремлені від списку пробілом.

// джерело


1
Я посперечався з вашою відповіддю в моєму власному дописі на цій сторінці. Це функція, а не групування команд.
успішно доношений

3
@donothingsuccessfully Функціональний орган - це групування команд.
Жил 'ТАК - перестань бути злим'

3

Я думаю, що @rush може дати правильну, якщо оманливу відповідь тут. Вилка-бомба визначає функцію, яка називається " :". Код у фігурних дужках не виконується, поки функція не буде викликана остаточним " :". Отже фігурні дужки як групування команд і фігурні дужки як тіло функції синтаксично однакові, але мають різну семантику.
З того самого документа , що цитує @rush:

Зауважте, що з історичних причин фігури, що оточують тіло функції, в найпоширенішому використанні мають бути відокремлені від тіла пробілами чи новими рядками. Це відбувається тому, що дужки є зарезервованими словами і розпізнаються як такі лише тоді, коли вони відокремлені від списку команд пробілом або іншим метахарактером оболонки. Також при використанні дужок список повинен бути закінчений крапкою з комою, знаком "&" або новим рядком.


3
Ні, відповідь пік правильна. Фігурні дужки навколо функціонального тіла - це той самий синтаксичний елемент, що і тоді, коли вони не обмежують функціональне тіло. Дивіться правила граматики оболонки : a function_bodyє compound_command(плюс необов’язково redirect_list). Простір потрібен тому {, що це зарезервоване слово, а не особливий символ.
Жил "ТАК - перестань бути злим"

Так, як я вже сказав, відповідь пік є правильною. Так, вони синтаксично однакові, як я вже сказав. Але brace_groupповодимося по-різному, коли частина функції, а коли ні. Я використовував групування команд, щоб описати останній випадок, і саме це було описано у посиланні на пік.
доношено успішно

2
Я не впевнений, що семантичне розмежування тут є суттєвим, оскільки саме синтаксис має значення для парсера. Справжня відповідь - {це не оператор, а застережене слово, і слова потрібно відокремлювати від інших слів, щоб вважати їх чіткими.
jw013
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.