複数行の文書があり、これを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