複数行のheredocumentから改行文字を含む1行のherestringまで

複数行のheredocumentから改行文字を含む1行のherestringまで

複数行の文書があり、これを1行の文字列に変換したいと思います。

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

私が得ることができる最も近い結果は次のとおりです。

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

しかし、私の考えではないと思います。改行文字各命令が実行可能になると、最終結果は次のようになります。ひも。結局「非正統的な」方法があるのではないだろうか?


HeredocとHerestringはどちらも、この重い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

答え1

printf "this\nthat\n" > /some/fileたとえば、ANSI-C引用符を使用して改行文字を含むhere-stringを作成できることを忘れないでください。

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

また、引用符のため、次の名前のディレクトリにファイルを作成しようとします*

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

これはBashで機能しますが、globがファイルと一致する場合にのみ機能します(/etc/php/foo/zz_overrides.iniおよび存在する場合、Bashはエラーを表示します/etc/php/bar/zz_overrides.ini)。

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

答え2

heredocが必要ない場合や、外部コマンド(たとえば)bashを呼び出すことなく、改行文字を含む文字列を直接使用できると思います。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

関連情報