为什么首先执行命令替换?

tes*_*ter 1 bash command-substitution

我正在研究 Bash shell。当我通过以下方式输入命令时

cmd1 $(cmd2) $(cmd3)
Run Code Online (Sandbox Code Playgroud)

执行命令的顺序是: cmd2-> cmd3->cmd1

当我查看Bash shell的shell操作顺序时,我无法完全掌握这种情况。

您能否准确指定 Bash shell 如何处理“命令替换”?例如,标记化是否在每次命令替换时递归返回?

Adm*_*Bee 5

原因是命令替换与任何其他 shell 扩展一样,旨在提供一种生成用于执行命令的命令行参数的动态方法。因此,为了cmd1使用cmd2和的输出cmd3作为参数运行,必须首先运行这两个。

shell 扩展的确切顺序可以在例如Bash 手册中找到。命令替换排在大括号扩展之后的第二位,与波形符扩展、参数(即变量)扩展和算术扩展处于同一位置。那些具有相同等级的扩展被“以从左到右的方式”评估,即按照它们在命令行上出现的顺序。

这将要求在嵌套替换的情况下,例如

cmd1 $(cmd2 $(cmd3)) $(cmd4)
Run Code Online (Sandbox Code Playgroud)

顺序将是cmd3-> cmd2-> cmd4->cmd1因为第一个扩展$(cmd2 $(cmd3))本身需要扩展$(cmd3),然后扩展$(cmd4), 在结果传递给调用之前cmd1