Эхо для файла, очевидно, нуждается в двойном экранировании с обратной косой чертой (\\\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).

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