echo $(FOO=bar foobar) 的结果在 POSIX shell 中未指定吗?

echo $(FOO=bar foobar) 的结果在 POSIX shell 中未指定吗?

我正在尝试了解 POSIX shell 标准这里

通过阅读它,我发现在以下 shell 命令中:

echo $(FOO=bar foobar)

有两个标记(针对顶级 shell,而不是子 shell): echo$(FOO=bar foobar)

这是一种有用的命令类型,而且根本不是人为的,因此应该定义结果是什么。但是,当您尝试使用标准中给出的语法解析它时,语法规则 7b 未指定第二个标记 - 因为它包含=但在此之前,不是有效名称。

这样一个“正常”命令的结果真的没有指定吗?还是什么不明白??

答案1

是的,echo $(FOO=bar foobar)有两个标记:echo$(FOO=bar foobar)

第一个标记是命令,第二个标记是扩展$(…)

该命令被识别为步骤1

扩展被认可为步骤5

如果当前字符是不带引号的“$”或“`”,则 shell 应识别参数扩展(Parameter Expansion)、命令替换(Command Substitution)的任何候选者的开始...

A ”命令替换“更准确地说:

…当命令包含如下时,应发生命令替换:

$(command)

shell 应通过执行来扩展命令替换命令在子 shell 环境中和替换命令替换(文本命令加上封闭的“$()”或反引号)以及标准输出命令……

随着 $(命令) 形式,左括号后面到匹配右括号的所有字符构成命令

因此很明显,命令在子 shell 中执行将是:

FOO=bar foobar

其中也有两个标记:变量赋值 ( FOO=bar) 和命令 ( foobar)。

执行这样的结果命令将更换整体$(…)

这就是所有有效的 POSIX 语法,我没有发现任何问题。

相关内容