Bash

從多行 heredocument 到單行 herestring,帶有換行符

  • January 27, 2018

我有這個多行的 heredocument,我希望將其翻譯成單行的 herestring:

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"

但我不認為在每個指令之後換行是可能的,因為最終結果是一個****string。也許畢竟有一些“非正統”的方式?


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

撇開你可以的事實不談printf "this\nthat\n" > /some/file,你可以用換行符創建一個here-string,例如ANSI-C引用:

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

此外,由於引號,這將嘗試在字面上命名的目錄中創建一個文件*

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

這可以在 Bash 中使用,但前提是 glob 匹配一個文件(如果你有/etc/php/foo/zz_overrides.iniand /etc/php/bar/zz_overrides.ini,Bash 會出錯)

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

引用自:https://unix.stackexchange.com/questions/419964