Эхо для файла, очевидно, нуждается в двойном экранировании с обратной косой чертой (\\\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 ответ
Проблема, кажется, исходит от встроенного echo
в dash
(который sh
в Ubuntu по умолчанию), который, кажется, обрабатывает его \
аргументы в отличие от других реализаций (/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 shell redirections делает команду более чистой, так как строка анализируется только один раз (в качестве аргумента printf
) вместо двух (сначала в качестве аргумента sh -c
а затем в качестве аргумента echo
).