Shell函数定义:为什么在括号后面有空格?


Answers:


13

{}

          { list; }

在大括号之间放置命令列表会导致该列表在当前Shell上下文中执行。没有创建子外壳。以下列表是分号(或换行符)。

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

// 来源


1
我在本页上的自己的帖子中对您的回答表示怀疑。这是一个功能而不是命令分组。
donothing成功地

3
@donothingsuccessfully函数主体命令分组。
吉尔(Gilles)'所以

3

我认为@rush如果在此产生误导,可能会给出正确的答案。叉子炸弹定义了一个称为“ ” 的函数:。花括号中的代码只有在最后的“ :” 函数调用后才能执行。因此,花括号作为命令分组和花括号作为函数主体在语法上是相同的,但具有不同的语义。
在与@rush 相同的文档中引用:

请注意,由于历史原因,在最常见的用法中,包围函数主体的花括号必须用空格或换行符与主体分开。这是因为括号是保留字,并且仅当它们由空格或另一个shell元字符与命令列表分隔时,才被识别为保留字。另外,使用花括号时,列表必须以分号,“&”或换行符结尾。


3
不,拉什的答案是正确的。函数主体周围的花括号与未定义函数主体时的语法元素相同。请参阅shell语法规则:a function_body是a compound_command(加上可选的redirect_list)。需要空格,因为{它是保留字,而不是特殊字符。
吉尔(Gilles)'所以

是的,正如我所说,拉什的答案是正确的。是的,正如我所说,它们在语法上是相同的。但是brace_group当函数的一部分与否时,s的行为会有所不同。我使用命令分组来描述后一种情况,这是在rush的链接中所描述的。
donothing成功地

2
我不确定语义上的区别在这里是否有意义,因为语法对解析器很重要。真正的答案{不是运算符,而是保留字,并且必须将字与其他字分开才能被区分。
2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.