もともとコマンド置換を実行するのはなぜですか?

もともとコマンド置換を実行するのはなぜですか?

私はBashシェルで作業しています。コマンドを入力すると

cmd1 $(cmd2) $(cmd3)

コマンドの実行順序は次のとおりです。 cmd2-> cmd3->cmd1

私が見るときシェル操作Bash シェルコマンドではこの状況をよく理解できません。

Bashシェルが「コマンドの置き換え」をどのように処理するかを正確に指定できますか?たとえば、トークン化はすべてのコマンド置換で繰り返し返されますか?

答え1

これは、他のシェル拡張と同様に、コマンド置換もコマンド実行のためのコマンドライン引数を生成する動的方法を提供するように設計されているためです。したがって、cmd1の出力を引数として使用するには、両方を最初に実行する必要があります。cmd2cmd3

シェル拡張の正確な順序は次のとおりです。バッシュマニュアルから。コマンド置換は中括弧拡張の次に、チルダ拡張、引数(つまり変数)拡張、および算術拡張と同じ場所に続きます。ランクが同じ拡張を評価します。「左から右へ」つまり、コマンドラインに表示される順番です。

これは入れ子になった置換の場合に必要です。

cmd1 $(cmd2 $(cmd3)) $(cmd4)

結果が呼び出しに渡される前に最初の拡張自体を拡張してから拡張する必要があるため、順序はcmd3-> cmd2-> cmd4-> です。cmd1$(cmd2 $(cmd3))$(cmd3)$(cmd4)cmd1

関連情報