shell函数定义:为什么左大括号后面有一个空格?

shell函数定义:为什么左大括号后面有一个空格?

你可能知道这一点叉子炸弹

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

我想知道为什么需要在左大括号后包含一个空格才能进行解析。

答案1

{}

          { list; }

将命令列表放在大括号之间会导致该列表在当前 shell 上下文中执行。没有创建子shell。列表后面需要分号(或换行符)。

除了创建子 shell 之外,由于历史原因,这两种结构之间还存在细微的差异。大括号是保留字,因此必须用空格或其他 shell 元字符将它们与列表分隔开。括号是运算符,即使它们没有通过空格与列表分隔,也会被 shell 识别为单独的标记。

//来源

答案2

我认为 @rush 可能在这里给出了一个正确但具有误导性的答案。叉子炸弹定义了功能称为“ :”。花括号中的代码直到函数被最后的“ :”调用时才会执行。因此花括号如下命令分组和大括号作为函数体语法相同但语义不同。
来自同一个文档正如@rush 引用的:

请注意,由于历史原因,在最常见的用法中,包围函数主体的花括号必须通过空格或换行符与主体分隔开。这是因为大括号是保留字,只有当它们通过空格或其他 shell 元字符与命令列表分隔时才会被识别。此外,使用大括号时,列表必须以分号、“&”或换行符结束。

相关内容