编辑以澄清我的问题:
POSIX 说:
如果 <newline> 跟在(未加引号的)<backslash> 之后,shell 应将其解释为行继续。<backslash> 和 <newline> 应在将输入拆分为标记之前删除。
然而,dash
或其他实现,首先标记化输入。结果,\<newline>
不被识别而是# this is a comment \
被丢弃。这种行为是否符合 POSIX?同样,POSIX 说在标记化之前应删除行继续。
下面的过程真的不符合 POSIX 吗?
- 阅读整个输入:
"echo hello ... \<newline> ... bye"
- 搜索未引用
\<newline>
并删除它们:"echo hello ... bye"
- 标记化:
"echo"(discard ' ')"hello"(discard ' ')(discard "# ... bye")
在带有 dash-0.5.10.2-6 sh (dash) 的 Ubuntu 上,我们得到以下信息
$ cat /var/tmp/test.sh
echo hello # this is a comment \
echo bye
$ sh /var/tmp/test.sh
hello
bye
这是因为 # 之后的所有内容都被视为注释,并且 \ 之前的所有内容都被丢弃,因此 \<newline> 的行继续不起作用。
但是,POSIX“转义字符(反斜杠)”部分指出
<backslash> 和 <newline> 应在将输入拆分为标记之前删除。
并且由于# 的注释处理是在标记化中完成的,
echo hello # this is a comment \
echo bye
应该相当于
echo hello # this is a comment echo bye
这是否意味着 sh 不符合 POSIX 标准?或者在这种情况下,评论优先于行延续是否有一些理由?