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


18

あなたはおそらくそのフォーク爆弾を知っています:

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

解析するために、開き中括弧の後にスペースを入れる必要があるのはなぜだろうか。

回答:


13

{}

          { list; }

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

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

// ソース


1
このページの私自身の投稿で、あなたの答えに戸惑いました。コマンドのグループ化ではなく、関数です。
-donothing正常に

3
@donothingsuccessfully関数本体コマンドのグループ化です。
ジル「SO-悪であるのをやめる」

3

ここで、誤解を招くような回答があった場合、@ rushが正しい答えを出していると思います。fork-bombは、「」という関数を定義します:。中括弧内のコードは、最後の " :" によって関数が呼び出されるまで実行されません。したがって、コマンドのグループ化としての中括弧と関数本体としての中括弧は構文的には同じですが、セマンティクスが異なります。@rushの引用
と同じドキュメントから:

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


3
いいえ、ラッシュの答えは正しいです。関数本体を囲む中括弧は、関数本体を区切っていない場合と同じ構文要素です。シェルの文法規則を参照してください:a function_bodycompound_command(プラスオプションredirect_list)です。{特殊文字ではなく予約語であるため、スペースが必要です。
ジル 'SO-悪であるのをやめる

はい、私が言ったように、ラッシュの答えは正しいです。はい、私が言ったように、それらは構文的に同じです。ただしbrace_group、関数の一部とそうでない場合の動作は異なります。後者のケースを説明するためにコマンドグループを使用していましたが、これは突進のリンクで説明されていたものです。
12

2
ここでは構文解析が重要な構文であるため、ここで意味の区別が重要かどうかはわかりません。本当の答えは{演算子ではなく予約語であり、単語を区別するために他の単語から分離する必要があります。
jw013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.