我正在尝试了解 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 语法,我没有发现任何问题。