De um documento de várias linhas para um herestring uniline, com quebras de linha

1

Eu tenho este documento multilinie que eu desejo traduzir em um uniline herestring:

cat <<-"PHPCONF" > /etc/php/*/zz_overrides.ini
  [PHP]
  post_max_size = 200M
  upload_max_filesize = 200M
  cgi.fix_pathinfo = 0
PHPCONF

O mais próximo que consegui é o seguinte:

cat >"/etc/php/*/zz_overrides.ini" <<< "[PHP] post_max_size = 200M upload_max_filesize = 200M cgi.fix_pathinfo = 0"

mas não acho que quebras de linha após cada diretiva ser possível, dado que o resultado final é uma string . Talvez haja algum caminho "não ortodoxo" afinal de contas?

Tanto o heredoc como o herestring destinam-se a substituir esta pesada operação sed:

sed -i "s/post_max_size = .M/post_max_size = 200M/ ; s/upload_max_filesize = .M/upload_max_filesize = 200M/ ; s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php/*/fpm/php.ini
    
por pntshere 27.01.2018 / 02:14

2 respostas

3

Deixando de lado o fato de que você poderia apenas printf "this\nthat\n" > /some/file , você pode criar uma string here com novas linhas com, por exemplo, Citações ANSI-C:

$ cat <<< $'this\nthat'
this
that

Além disso, por causa das aspas, isso tentará criar um arquivo em um diretório literalmente denominado * :

cat > "/etc/php/*/zz_overrides.ini"

Isso funcionaria no Bash, mas somente se o glob corresponder a um arquivo (se você tiver /etc/php/foo/zz_overrides.ini e /etc/php/bar/zz_overrides.ini , o Bash fornecerá um erro)

cat > /etc/php/*/zz_overrides.ini
    
por 27.01.2018 / 14:32
2

Acho que bash permite que você use uma string com novas linhas diretamente, sem necessidade de um heredoc ou chamando comandos externos (como cat ):

$ php_conf='
  [PHP]
  post_max_size = 200M
  upload_max_filesize = 200M
  cgi.fix_pathinfo = 0
'

$ echo "$php_conf"

 [PHP]
 post_max_size = 200M
 upload_max_filesize = 200M
 cgi.fix_pathinfo = 0
    
por 27.01.2018 / 13:42