单引号不应该是 POSIX shell 中的“硬”引号吗?
与 Bash 不同,为什么 dash 似乎在其中处理转义符?
$ bash --posix -c "echo ['[\\n]']"
[[\n]]
$ dash -c "echo ['[\\n]']"
[[
]]
单引号不应该是 POSIX shell 中的“硬”引号吗?
与 Bash 不同,为什么 dash 似乎在其中处理转义符?
$ bash --posix -c "echo ['[\\n]']"
[[\n]]
$ dash -c "echo ['[\\n]']"
[[
]]
单引号的行为确实相同,
echo
不同的是实现。当您运行
sh -c "echo ['[\\n]']"
(对于任何sh
)时,发生的第一件事是您的交互式 shell 处理双引号字符串,将 the\\
变成单个\
. 传递给 shell 执行的字符串是echo ['[\n]']
。echo
在该内壳中启动的命令(可能是内置的)会看到单个参数,[[\n]]
并且一些echo
进程 C 风格的反斜杠转义的实现类似于\n
换行符,而其他一些则没有。试试看为什么
sh -c "printf '%s\\n' ['[\\n]']"
printf比 echo 好?