Echo para arquivo aparentemente precisa de barra invertida de escape duplo (\\\ n) para escrever \ n. Por quê?

1

De acordo com os documentos graylog2 , eu preciso adicionar esta linha ao meu rsyslog.conf:

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

Eu estou fazendo isso programaticamente quando giro um servidor, então o comando que estou fazendo atualmente é:

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

Estou escapando do cifrão, das aspas duplas e da barra invertida antes do n. No entanto, \n e \n escrevem uma nova linha real no arquivo, mas \\n grava \n corretamente. Por que o \n não funciona?

    
por Zook 06.10.2014 / 18:36

1 resposta

2

O problema parece vir do built-in echo in dash (que é sh no Ubuntu por padrão), que parece processar seus argumentos \ diferentemente de outras implementações ( /bin/echo e echo no Bash):

$ sh -c "echo '\n'" 


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

Isso não é surpreendente, pois o uso dos argumentos \ em echo não é padrão:

link

  

Se o primeiro operando for -n , ou se algum dos operandos contiver um caractere de barra invertida ('\'), os resultados serão definidos pela implementação.

Você deve usar printf em vez de echo , assim:

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

Como um bônus adicional, usar sudo tee para gravar em arquivos como root em vez de sudo sh -c + redirecionamentos de shell torna o comando mais limpo, pois a sequência é analisada apenas uma vez (como um argumento para printf ) em vez de duas vezes (primeiro como um argumento para sh -c e depois como um argumento para echo ).

    
por fkraiem 06.10.2014 / 19:02