我正在研究 Bash shell。当我通过以下方式输入命令时
cmd1 $(cmd2) $(cmd3)
执行命令的顺序是:
cmd2
-> cmd3
->cmd1
当我看着外壳操作Bash shell 的命令,我无法完全掌握这种情况。
您能否准确指定 Bash shell 如何处理“命令替换”?例如,标记化是否在每次命令替换时递归返回?
答案1
原因是命令替换与任何其他 shell 扩展一样,旨在提供一种生成用于执行命令的命令行参数的动态方法。因此,为了使用和cmd1
的输出作为参数运行,必须首先运行这两个。cmd2
cmd3
可以找到 shell 扩展的确切顺序,例如在 Bash 手册中。命令替换排在大括号扩展之后的第二位,与波形符扩展、参数(即变量)扩展和算术扩展处于同一位置。评估那些具有相同等级的扩展“以从左到右的方式”,即按照它们在命令行中出现的顺序。
这将要求在嵌套替换的情况下,例如
cmd1 $(cmd2 $(cmd3)) $(cmd4)
顺序将是cmd3
-> cmd2
-> cmd4
->cmd1
因为第一个扩展$(cmd2 $(cmd3))
本身需要扩展$(cmd3)
,然后扩展$(cmd4)
, 在结果传递给调用之前cmd1
。