POSIX shell在命令替换中注释

时间:2017-05-06 01:43:05

标签: bash sh posix language-lawyer busybox

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

echo "`echo a #`"

打印a,但是

echo "$(echo a #)"

给出了关于错过结束)的错误。

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

echo "`echo a #`"

echo "$(echo a #)"

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

1 个答案:

答案 0 :(得分:7)

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

  

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

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

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

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

注意:

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