在主流 POSIX 兼容 shell 中转义双引号内的特殊字符的行为是否与 POSIX 不一致?

在主流 POSIX 兼容 shell 中转义双引号内的特殊字符的行为是否与 POSIX 不一致?

根据POSIX Shell 命令语言页面:

\

<backslash>仅当后跟以下字符之一时,应保留其作为转义字符的特殊含义(请参阅转义字符(反斜杠) )当被认为是特殊的:

$ ` " \ <newline>

我将此解释为\仅应转义这五个特殊字符之一(如果它在给定上下文中特殊的话)。

ash、dash、bash 和 ksh 的手册页不包含“当被认为特殊时”条款。我认为这意味着(并通过基本实验证实)\具有无条件转义这五个字符的效果,即使这五个字符之一在其给定上下文中并不特殊。

考虑 的输出$ printf '%s\n' "\abcde",即\abcde。这是预期的,因为a在这种情况下(或与此相关的任何情况下)并不特殊;因此\并不特殊,按字面意思处理。

现在考虑 的输出$ printf '%s\n' "\\abcde",即\abcde。这不是我期望的行为。在我看来,字符串中的第一个反斜杠\\abcde也应该按字面意思处理,因为它后面跟着的\上下文中\并不特殊。我期望的输出是\\abcde.

我看到意外行为的另一个场景是在 的输出中$ printf '%s\n' "ab\$",即ab$.在我看来,$在这种情况下确实有特殊的含义,因为它确实有助于引入参数扩展、命令替换或算术扩展。因此,在我看来,\应该按字面意思对待,因为它后面跟着的$上下文$并不特殊。我期望的输出是ab\$.

根据记录,我希望我在这里完全没有根据。这让我的生活变得更加困难,不得不担心仅在某些情况下才能逃脱这五个角色。我努力尽可能做到 posixly 正确,并且\如果主流 POSIX 兼容 shell 中的这种(个人期望的)行为不符合 POSIX,我不想无条件地依赖于转义这五个特殊字符。

答案1

此注提出删除文本的建议当被认为是特殊的

注:0000998 中提供了一组建议的更正

该说明还报告称,该变更已于 2012 年 8 月 30 日获得批准。

我无法说出为什么它仍然用在现在的措辞中

我相信你可以忘记这句话。

答案2

echo "\abc\$\\"(例如)涉及两个步骤。

首先,由于 的字符串参数echo是双引号引起来的,因此 shell 将对其中的转义字符进行处理。

在这种情况下,"\abc\$\\"会将其转换为\abc$\之前将其传递给echo。由于不是“特殊”字符之一,因此遗嘱\a保持不变。a其他转义字符将是文字,这意味着它们在 shell 中不再具有特殊含义( 不会$启动扩展,反斜杠不会转义下一个字符等。)请注意,$双引号字符串末尾的 an 仍然是“特殊”因为它可以引入了扩展,但字符串没有在其后立即结束。两个字符串"a$""a\$"是相同的,因为$第一个字符串中的 不应用于任何内容。

然后,echo可以对该字符串参数进行自己的解释。例如,的一些实现echo将被视为表示“响铃字符”。\a

我还认为您误读了这里的标准。反斜杠后跟特殊字符之一的评估将消除反斜杠。您似乎认为它应该保持不变,并且\$应该保留为\$。该标准规定对面的的。

相关内容