POSIX7
kennytm が引用されman bash
ていますが、そのほとんどは POSIX 7 でもあります: http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_07_04 :
リダイレクション演算子「<<」と「<<-」はどちらも、「ヒアドキュメント」と呼ばれるシェル入力ファイルに含まれる行をコマンドの入力にリダイレクトできます。
ヒアドキュメントは、次の単語の後に始まり、その間に文字がなく<newline>
、区切り記号と a のみを含む行が存在するまで続く単一の単語として扱われます。次に、次のヒアドキュメントがあれば、それが開始されます。形式は次のとおりです。<newline>
<blank>
[n]<<word
here-document
delimiter
ここで、オプションの n はファイル記述子番号を表します。番号を省略した場合、ヒアドキュメントは標準入力 (ファイル記述子 0) を参照します。
単語内の任意の文字が引用されている場合、区切り文字は単語の引用削除を実行することによって形成され、ヒアドキュメント行は展開されません。それ以外の場合、区切り文字は単語そのものになります。
Word 内の文字が引用符で囲まれていない場合、ヒアドキュメントのすべての行は、パラメーター展開、コマンド置換、および算術展開のために展開されます。この場合、<backslash>
入力内の は<backslash>
内側の二重引用符として動作します (二重引用符を参照)。ただし、二重引用符 ( '"' ) は、"$()"、"``"、または "${}" 内に二重引用符が表示される場合を除き、ヒア ドキュメント内で特別に扱われません。
リダイレクト記号が「<<-」の場合、<tab>
入力行と末尾の区切り文字を含む行から先頭のすべての文字が削除されます。行に複数の「<<」または「<<-」演算子が指定されている場合、最初の演算子に関連付けられたヒアドキュメントがアプリケーションによって最初に提供され、シェルによって最初に読み取られる必要があります。
ヒアドキュメントが端末デバイスから読み取られ、シェルが対話型の場合、区切り文字が認識されるまで、入力の各行を読み取る前に、シェル変数で説明されているように処理された変数 PS2 の内容を標準エラーに書き込む必要があります。
例
まだ与えられていないいくつかの例。
引用符はパラメーターの展開を防ぎます
引用符なし:
a=0
cat <<EOF
$a
EOF
出力:
0
引用符付き:
a=0
cat <<'EOF'
$a
EOF
または(醜いが有効):
a=0
cat <<E"O"F
$a
EOF
出力:
$a
ハイフンは先頭のタブを削除します
ハイフンなし:
cat <<EOF
<tab>a
EOF
は<tab>
リテラル タブであり、次のように挿入できます。Ctrl + V <tab>
出力:
<tab>a
ハイフン付き:
cat <<-EOF
<tab>a
<tab>EOF
出力:
a
cat
これはもちろん、周囲のコードのようにインデントできるようにするために存在します。これにより、読みやすく、維持しやすくなります。例えば:
if true; then
cat <<-EOF
a
EOF
fi
残念ながら、これはスペース文字には機能しません。POSIX はtab
ここでインデントを優先しました。うわぁ。