Skip to content
Latchkey

here-documentとは何か?インラインの複数行入力

here-documentは、<<区切り記号を使って、インラインの複数行テキストブロックをコマンドの標準入力として渡すshellの機能です。

いくつかの行のテキストをコマンドに渡す必要があるとき、echoを1つずつ入力するのは面倒です。here-documentを使うと、テキストブロック全体をスクリプトに直接埋め込み、それをstdinとしてコマンドにpipeできます。CIスクリプトはhere-docを使って、configファイルを書いたり、データベースにSQLを渡したり、複数行のメッセージを組み立てたりします。

here-documentとは何か

here-docは<<に続いて区切り記号の単語、それからテキストの行が続き、その区切り記号が行に単独で現れたときに終わります。その間のすべての行がstdinとしてコマンドに送られます。

基本的な例

cat <<EOF > config.txtと書き、次に数行、そしてEOFと書くと、まさにそれらの行を含むファイルが作られます。マーカーの間のテキストがcatへの入力となり、それが書き出されます。

展開とクォート

  • デフォルトでは、here-doc内の変数とcommand substitutionは展開されます。
  • <<'EOF'のように区切り記号をクォートすると展開が無効になり、テキストはリテラルになります。
  • <<-EOFを使うと先頭のタブが取り除かれ、インデントがきれいになります。

here-docとhere-string

here-documentは複数の行を供給し、<<<と書くhere-stringは単一の文字列を供給します。どちらも別ファイルなしでstdinを供給しますが、here-docはテキストのブロック向けです。

CIにおけるhere-document

CIスクリプトはhere-docを使って、configファイルをインラインで生成したり、サービスに対して複数文のSQLを実行したりします。クォートに注意してください。クォートされていない区切り記号は$参照を展開し、templateを壊したりsecretをファイルに漏らしたりする可能性があります。

マネージドrunnerでのファイル生成

Latchkeyのrunnerでは、here-docはステップ中にconfigやスクリプトをrepoにコミットせずに書くきれいな方法です。内容をリテラルのままにすべきとき、特にsecretのplaceholderを含む場合は、区切り記号をクォートしてください。

重要なポイント

  • here-documentは、インラインのテキストブロックをコマンドにstdinとして渡します。
  • <<DELIMで始まり、DELIMが行に単独で現れたときに終わります。
  • 区切り記号をクォートすると、リテラル内容のために変数展開が無効になります。

関連ガイド