如果bash没有在双引号中保留反斜杠,那么为什么echo -e“\ n”有效?

时间:2011-12-26 04:44:43

标签: bash shell escaping

来自bash手册页

  

用双引号括起字符会保留引号中所有字符的字面值,但$,`,\除外,并且,当启用历史记录扩展时,!。

考虑到这一点,echo -ne "\n"如何产生换行符?在传递给echo之前,shell是否会扩展为“\ n”?

我认为它可能有效,因为echo是内置的,因此shell足够聪明,可以做正确的事情。但是,即使调用外部/usr/bin/echo -ne "\n"也可以。

更令人好奇的是,无论我是双引号还是单引号\n,以下两个命令都表明bash正在传递\\n作为参数:

$ strace /usr/bin/echo "\n" 2>&1 | head -n1
execve("/usr/bin/echo", ["/usr/bin/echo", "\\n"], [/* 33 vars */]) = 0
$ strace /usr/bin/echo '\n' 2>&1 | head -n1
execve("/usr/bin/echo", ["/usr/bin/echo", "\\n"], [/* 33 vars */]) = 0

这里发生了什么?

1 个答案:

答案 0 :(得分:4)

继续阅读:

  

反斜杠只有在以下字符之一后才会保留其特殊含义:$`"\<newline>

由于它后面跟着一封信,所以它没有保留其特殊含义,而是直接传递给该程序。