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

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

あなたはおそらくこれを知っているでしょうフォーク爆弾:

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

構文解析のために開く中括弧の後にスペースを含める必要がある理由は疑問に思います。

答え1

{}

          { list; }

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

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

//源泉

答え2

@rushがここで正確ですが、誤解を招く答えを提供した可能性があると思います。フォーク爆弾の定義機能と呼ばれる:」。中かっこ内のコードは、関数が:最後の ""として呼び出されるまで実行されません。したがって、中括弧は次のようになります。コマンドのグループ化そして中括弧は機能本文構文は同じですが、意味が異なります。
同じことから文書@rushが引用したように:

歴史的な理由から、最も一般的な使用法では、関数の本文を囲む中括弧は、スペースまたは改行文字で本文と区別する必要があります。これは、中かっこが予約語であり、スペースやその他のシェルメタ文字でコマンドリストと区別されている場合にのみ認識されるためです。また、中かっこを使用する場合、リストはセミコロン、「&」、または改行文字で終わる必要があります。

関連情報