POSIXシェル構文がFOO = bar foobarを受け入れる方法

POSIXシェル構文がFOO = bar foobarを受け入れる方法

POSIXシェル構文とは何ですか? http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_10

次の割り当てを含む単純なコマンドを受け入れます。

FOO=bar foobar

ここで、最初の単語は規則7bに従ってトークンとして受け入れる必要がありますASSIGNMENT_WORD(ただし、この規則が関連する制作に適用されることは明示的に指定されていませんが、ASSIGNMENT_WORD理解できると思います)。

その後、2番目の言葉は受け入れられません。これを減らす唯一の方法は、cmd_word本番を使用することです。ただし、これを行うには、規則7bではこれをaと言い、WORD規則7bではを含まない単語については何も言及しません=

規則7bには、次のフレーズを追加する必要があります。

If the TOKEN does not contain `=` then it is a `WORD`.  

これがないと、現在作成されている構文が正しくありません。私は正しいですか?

答え1

文法は1つの単語のみを割り当て、それ以降の単語はコマンドとして扱われます。

あなたが引用した規則はTOKEN、引用符のないスペースは含めることはできません。バラより2.3 トークン認識、例えば、

  1. 現在の文字が引用されていない場合<blank>、前の文字を含むすべてのトークンは区切り、現在の文字は削除されます。

答え2

この住所があなたの質問に直接答えてくれると思います。

2.10.2 シェル構文規則

  1. [コマンド名]

    TOKENが予約語の場合、その予約語のトークン識別子が生成されます。それ以外の場合は、トークンWORDを返す必要があります。

これは、ルール7よりも優先されるルール1です。すべての単一の単語(除外=)は「コマンド名」として解釈されます。が含まれている場合は、=ルール7が適用されます。

ルール1には=を含む例外がないと言うこともできますが、これは次の説明で想定する必要があると思います。簡単なコマンド":

2.9.1 簡単なコマンド

「単純なコマンド」は、任意の順序で任意の変数割り当ておよびリダイレクトのシーケンスであり、任意にワードおよびリダイレクトが続き、制御演算子によって終了される。

簡単に言うと、「変数の割り当て」「単語」「リダイレクト」

そして: 「変数割り当て」に=

関連情報