シェル関数の定義: 開き中括弧の後にスペースがあるのはなぜですか?

シェル関数の定義: 開き中括弧の後にスペースがあるのはなぜですか?

おそらくご存知でしょうフォーク爆弾:

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

解析するには、開き中括弧の後にスペースを含めることがなぜ必要なのか疑問に思います。

答え1

{}

          { list; }

中括弧でコマンドのリストを配置すると、そのリストは現在のシェルのコンテキストで実行されます。サブシェルは作成されません。リストの後にセミコロン (または改行) が必要です。

サブシェルの作成に加えて、歴史的な理由により、これら 2 つの構造には微妙な違いがあります。中括弧は予約語であるため、空白または他のシェル メタ文字でリストから区切る必要があります。括弧は演算子であり、空白でリストから区切られていなくても、シェルによって個別のトークンとして認識されます。

//ソース

答え2

@rushはここで誤解を招くかもしれないが正しい答えを出していると思う。フォーク爆弾は関数中括弧内のコードは:、最後の「」によって関数が呼び出されるまで実行されません:。したがって、中括弧はコマンドのグループ化そして中括弧は関数本体文法的には同じだが意味論が異なる。
同じ書類@rush が引用しているように:

歴史的な理由により、最も一般的な使用法では、関数本体を囲む中括弧は、空白または改行で本体から分離する必要があることに注意してください。これは、中括弧が予約語であり、コマンド リストから空白または別のシェル メタ文字で区切られている場合にのみ予約語として認識されるためです。また、中括弧を使用する場合は、リストをセミコロン、'&'、または改行で終了する必要があります。

関連情報