任意の複数行テキストをコマンドでファイルに書き出す

Last modified: 2021-10-05

端末シェルのヒアドキュメント機能を用いる

端末シェルで “ヒアドキュメント (Here document)” という機能を用いると複数行の文字列をコマンドの標準入力として受け取ることができる。

書式

[コマンド] <<[終端文字列]
[入力の内容...]
[終端文字列]

<<の後ろの文字列の内容の行を渡すまでの間に入力した複数行の内容を標準入力としてコマンドを実行できる。

終端を示す文字列としては “End Of File” に由来するEOFがよく用いられるが、EOFという行を含むテキストを書き出すには他の文字列を指定する。

対話シェルで試す

catコマンドは引数を付けずに実行すると標準入力の内容をそのまま標準出力に出力するのだが、これを利用してリダイレクトで任意の内容を(コマンド実行により)ファイルに書き出すことができる。

(「EOF」という行を終端にする場合)
$ cat <<EOF > [ファイル]
> 書き出したい文字列
> 書き出したい文字列
> 書き出したい文字列
> ...
> EOF

(「FOO」という行を終端にする場合)
$ cat <<FOO > [ファイル]
> 書き出したい文字列
> 書き出したい文字列
> 書き出したい文字列
> ...
> FOO

シェルスクリプト内の使用

実際にはシェルスクリプト内で(決まった内容のテキストファイルを作成するために)

cat <<EOF > [ファイル]
内容...
EOF

のように用いられることが多い。

また、(差分データを標準入力で受け付ける)patchコマンドを差分データ付きで

patch -p0 <<EOF
[パッチの内容...]
EOF

のような形で実行することもできる。