防止“ echo”解释反斜杠转义符

Mat*_*ngh 3 macos terminal newline zsh echo

我想向包含新的换行序列的文件回显某些内容,但是我希望它们保持转义状态。我正在寻找与这个问题相反的东西。

echo "part1\npart2" >> file
Run Code Online (Sandbox Code Playgroud)

我想在文件中看起来像这样

$ cat file
old
part1\npart2
Run Code Online (Sandbox Code Playgroud)

但看起来像

$ cat file
old
part1
part2
Run Code Online (Sandbox Code Playgroud)

Ben*_* W. 5

这是一个很好的示例,说明了POSIX为什么建议使用printf而不是的方式echo(请参见此处,“应用程序使用情况”下的内容):您不知道从中得到什么echo

您可以获得:

  • echo默认情况下,不解释反斜杠转义的 内置shell
    • 示例:Bash内置函数echo具有-e启用反斜杠转义解释并检查xpg_echoshell选项的选项
  • echo默认情况下解释反斜杠转义的 内置shell
    • 示例:zsh,破折号
  • 一个独立的可执行文件/bin/echo:可能取决于哪个文件– GNU Coreutils可以echo理解该-e选项,例如内置的Bash。

POSIX规范说明了这一点(重点是我):

应支持以下操作数: 要写入标准输出的字符串。如果第一个操作数是,或者任何一个操作数包含一个字符,则结果是实现定义的
string
-n<backslash>

因此,对于便携式解决方案,我们可以使用printf

printf '%s\n' 'part1\npart2' >> file
Run Code Online (Sandbox Code Playgroud)

其中\n格式字符串中的in将始终被解释,而\nin参数中的in将永远不会被解释,从而导致

part1\npart2
Run Code Online (Sandbox Code Playgroud)

被附加到file