回显到文件显然需要双转义反斜杠 (\\\n) 来写入 \n。为什么?

回显到文件显然需要双转义反斜杠 (\\\n) 来写入 \n。为什么?

根据graylog2 文档,我需要将这一行添加到我的 rsyslog.conf 中:

$template GRAYLOGRFC5424,"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msg% \n"

当我启动服务器时,我正在以编程方式执行此操作,因此我当前正在运行的命令是:

sudo sh -c 'echo "\$template GRAYLOGRFC5424,\"<%pri%>%protocol-version% %timestamp:::date-rfc3339% %HOSTNAME% %app-name% %procid% %msg% \\\n\"" >> rsyslog.conf'

我转义了美元符号、两个双引号以及 n 之前的反斜杠。但是,\n\\n都会向文件中写入实际的换行符,但\\\n写入\n正确。为什么不起作用\\n

答案1

问题似乎来自内置函数echodash默认sh情况下在 Ubuntu 中),它处理\参数的方式似乎与其他实现(以及Bash 中的/bin/echo内置函数)不同:echo

$ sh -c "echo '\\n'" 


$ sh -c "/bin/echo '\\n'"
\n
$ bash -c "echo '\\n'"
\n

这并不奇怪,因为使用\参数echo是非标准的:

http://pubs.opengroup.org/onlinepubs/009695399/utilities/echo.html

如果第一个操作数是-n,或者如果任何操作数包含反斜杠('\')字符,则结果由实现定义。

您应该使用printf而不是echo,如下所示:

printf '$template GRAYLOGRFC5424,"<%%pri%%>%%protocol-version%% %%timestamp:::date-rfc3339%% %%HOSTNAME%% %%app-name%% %%procid%% %%msg%% \\n"\n' | sudo tee -a rsyslog.conf

作为额外的好处,使用sudo tee以 root 身份写入文件而不是sudo sh -c+ shell 重定向使得命令更清晰,因为字符串只被解析一次(作为 的参数printf)而不是两次(首先作为 的参数sh -c,然后作为 的参数echo)。

相关内容