单引号在 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 更好?