POSIXシェル標準を理解しようとしています。ここ
それを読んで、私は次のシェルコマンドで次を見つけました。
echo $(FOO=bar foobar)
2つのフラグがあります(サブシェルではなく最上位シェル用) echo
。$(FOO=bar foobar)
これは便利なコマンドタイプであり、まったく人為的ではないため、結果が何であるかを定義する必要があります。ただし、標準で提供されている構文を使用して解析しようとすると、構文規則7bは2番目のトークンを指定しません。なぜなら、そのトークンには=
有効な名前が含まれていますが、それ以前にはないからです。
そのような「正常な」コマンドの結果は実際には指定されていませんか?まだ理解していませんか? ?
ベストアンサー1
はい、echo $(FOO=bar foobar)
2つのマーカーがあります:echo
と$(FOO=bar foobar)
。
最初のタグはコマンドで、2番目のタグは拡張子です$(…)
。
コマンドは次のように認識されます。ステップ1
拡張子は次のように認識されます。ステップ5
現在の文字が引用されていない「$」または「`」の場合、シェルはパラメータ拡張、コマンド置換...の候補の開始を認識する必要があります。
「ㅏ」コマンドの置き換え「より正確に:
...コマンドに次のものが含まれている場合は、コマンド置換が発生する必要があります。
$(command)
シェルは次のコマンドを実行してコマンド置換を拡張する必要があります。注文するサブシェル環境で置換コマンドの置換(テキスト注文する「$()」または逆引用符を含む)と標準出力注文する…
$(注文する) 形式、左角かっこから一致する右角括弧までのすべての文字で構成注文する。
したがって、それは明らかです注文するサブシェルで実行されるものは次のとおりです。
FOO=bar foobar
FOO=bar
変数割り当て()とコマンド(foobar
)という2つのタグもあります。
これを実行した結果注文する全体が交換されます$(…)
。
これはすべて有効なPOSIX構文であり、問題はありません。