なぜPOSIX Shell Grammarの開始中括弧の後に中括弧コマンドグループにスペースが必要なのですか?
TL; DR:POSIXブレースグループで{予約語の後にスペースが必要なのに、サブシェルでは予約語の後にスペースがないのはなぜ(ですか? POSIXシェル文法は、ブレースグループとサブシェルを次のように定義します brace_group : Lbrace compound_list Rbrace subshell : '(' compound_list ')' 今、それを文字通り読んでいる場合、スペースは重要です。これは、次のように開き中括弧と括弧を区切るスペースが必要であることを意味します { echo hello world; } ( echo hello world ) これは、複合コマンドの定義とも一致します。 これらの複合コマンドのそれぞれには、最初に予約語または制御演算子があり、最後に対応するターミネーター予約語または演算子があります。 ただし、意味がないのはなぜか(list)、問題なく機能する( list )(その後ろのスペース(は不要)が、ブレースの展開には先行スペースが必要である、つまり機能{echo hello;}しないためである。 もちろん、予約語がシェルワードとして扱われると、フィールド分割の概念に合わせるために後でスペースが必要になりますが、定義自体はスペースについて言及していません。さらに、複合コマンドのPOSIX定義で両方が予約語と見なされている場合{、(これらの予約語の後のスペース文字に関して、それらの扱いが異なるのはなぜですか?現在、ksh(1)のマニュアルには次のように記載されています。 文字のシーケンスである単語は、引用符で囲まれていない空白文字(スペース、タブ、および改行)またはメタ文字(<、>、|、;、&、(および))で区切られます。 言い換えると、kshが(最初の単語がコマンドまたは変数の割り当てである単語の区切り文字として認識することは理にかなっています。ただし、POSIXは(メタ文字として言及されていないようです。POSIX文法に関して私が見つけた唯一の可能な説明{は、「トークン」と見なさ(れるというものです。 /* These are reserved words, not operator tokens, and are recognized when reserved words are recognized. */ …