为什么单引号在 bash --posix 和 dash 中的行为不同?

为什么单引号在 bash --posix 和 dash 中的行为不同?

单引号在 POSIX shell 中不应该是“硬”引号吗?
与 Bash 不同,为什么 dash 似乎在内部处理转义符?

$ bash --posix -c "echo ['[\\n]']"
[[\n]]
$ dash -c "echo ['[\\n]']"
[[
]]

答案1

单引号的行为确实相同,只是echo实现不同。

当您运行sh -c "echo ['[\\n]']"(对于任何sh)时,发生的第一件事是交互式 shell 处理双引号字符串,将 转换\\为单个\。传递到 shell 执行的字符串是 then echo ['[\n]']

在该内壳中启动的命令echo(可能是内置的)会看到单个参数,以及进程 C 风格反斜杠转义符[[\n]]的一些实现,例如换行符,而其他一些则不会。echo\n

尝试sh -c "printf '%s\\n' ['[\\n]']"一下,然后看看为什么 printf 比 echo 更好?

相关内容