我正在写一个shell,并且从bash,dash和busybox的灰烬中得到意外的解析:
echo "`echo a #`"
打印a
,但是
echo "$(echo a #)"
给出了关于错过结束)
的错误。
如何根据POSIX解析命令替换中的注释? 所以,对于命令:
echo "`echo a #`"
和
echo "$(echo a #)"
shell会将注释解析为延伸到命令替换的末尾,还是行的末尾? 另外,如果命令替换不是双引号,shell会不同地解析它? 最后,还有其他任何构造(在POSIX或bash中),注释可以在这样的引号内开始吗?
答案 0 :(得分:7)
根据Posix(Shell&Utilities, §2.6.3),"`echo a #`"
未定义(意味着不应该使用它):
第一个未加引号的非转义反引用应满足对匹配反引号的搜索;在此搜索过程中,如果在shell评论中遇到未转义的反引号,则会发生未定义的结果。 (重点补充)
但是,$(
命令替换标记由“第一个匹配)
”终止;暗示(由Rationale,注1中的示例明确指出)是匹配的)
不能在shell注释,here-doc或引用的字符串中。
围绕命令替换的引用在任何一种情况下都不相关(当然,“未定义的结果”在引用的情况下可能不同,因为它们未定义。)
在bash和某些其他shell中,注释也可能存在于进程替换中(例如,<(…)
);但是,不能引用过程替换。