POSIX shell在命令替换中注释

pro*_*ake 7 bash posix sh language-lawyer busybox

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

echo "`echo a #`"
Run Code Online (Sandbox Code Playgroud)

a然而,打印

echo "$(echo a #)"
Run Code Online (Sandbox Code Playgroud)

给出了关于错过结账的错误).

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

echo "`echo a #`"
Run Code Online (Sandbox Code Playgroud)

echo "$(echo a #)"
Run Code Online (Sandbox Code Playgroud)

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

ric*_*ici 7

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

第一个未加引号的非转义反引用应满足对匹配反引号的搜索; 在此搜索期间,如果在shell注释中遇到未转义的反引号,则会发生未定义的结果.(重点补充)

但是,$(命令替换标记由"第一次匹配)" 终止; 暗示(由基本原理中的示例明确指出,注1)是匹配)不能在shell注释,here-doc或引用的字符串中.

在任何一种情况下,命令替换的引号都不相关(当然,"未定义的结果"在引用的情况下可能不同,因为它们是未定义的.)

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


笔记:

  1. 感谢@ mklement0,他在评论中包含了此链接.