Эхо в файл, по-видимому, должно удвоить обратную косую черту выхода (\\\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
задан 6 October 2014 в 20:51

1 ответ

Проблема, кажется, возникает из встроенного echo в dash (который является sh в Ubuntu по умолчанию), который, кажется, обрабатывает \ аргументы по-другому по сравнению с другими реализациями (/bin/echo и встроенное echo в Bash):

$ 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 записать в файлы как корень вместо sudo sh -c + перенаправления оболочки делают инструмент для очистки команды, так как строка анализируется только однажды (как аргумент printf) вместо дважды (сначала как аргумент sh -c и затем как аргумент echo).

2
ответ дан 11 November 2019 в 09:31

Другие вопросы по тегам:

Похожие вопросы: