POSIX shell 命令替换中的评论

POSIX shell comments in command-substitutions

我正在写一个 shell,并且从 bash、dash 和 busybox 的 ash 中得到了意外的解析:

echo "`echo a #`"

打印 a,但是

echo "$(echo a #)"

给出关于缺少结束符的错误 )

如何根据 POSIX 解析命令替换中的注释? 所以,对于命令:

echo "`echo a #`"

echo "$(echo a #)"

shell 会将注释解析为扩展到命令替换的末尾,还是扩展到行尾? 此外,如果命令替换不在双引号中,shell 会以不同方式解析它吗? 最后,是否有任何其他构造(在 POSIX 或 bash 中)评论可以像这样在引号内开始?

根据Posix (Shell&Utilities, §2.6.3),"`echo a #`"未定义(暗示不应使用):

The search for the matching backquote shall be satisfied by the first unquoted non-escaped backquote; during this search, if a non-escaped backquote is encountered within a shell comment, … undefined results occur. (emphasis added)

然而,$(命令替换标记被“第一个匹配的)”终止;暗示(通过 Rationale 中的示例明确说明,注 1)是匹配的 ) 不能在 shell 注释、here-doc 或引用的字符串中。

命令替换周围的引号在任何一种情况下都不相关(当然,“未定义的结果”在引用的情况下可能会有所不同,因为它们是未定义的。)

在 bash 和某些其他 shell 中,注释也可以出现在进程替换中(例如,<(…));但是,不能引用进程替换。


备注:

  1. 感谢 @mklement0,他在评论中包含了这个 link。