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 中,注释也可以出现在进程替换中(例如,<(…)
);但是,不能引用进程替换。
备注:
- 感谢 @mklement0,他在评论中包含了这个 link。
我正在写一个 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 中,注释也可以出现在进程替换中(例如,<(…)
);但是,不能引用进程替换。
备注:
- 感谢 @mklement0,他在评论中包含了这个 link。