Next: , Previous: Shellology, Up: Portable Shell


10.2 ヒアドキュメント

\’は,次のシンボルと一緒になって特別の意味を持たないので,維持され る‘\’に依存しないでください.OpenBSD 2.7のネイティブな /bin/shでは,‘\"’は‘"’に展開され,ヒアドキュメントで は引用符で囲まれていない分離子として用いられます.一般的な規則として, ‘\\’が‘\’に展開される場合,‘\’を得るために‘\\’ を使 用してください.

OpenBSD 2.7の/bin/shでは,以下のようになります.

     $ cat <<EOF
     > \" \\
     > EOF
     " \

そして,Bashでは以下のようになります.

     bash-2.04$ cat <<EOF
     > \" \\
     > EOF
     \" \

多くの古い(Bourneシェルを含む)シェルでは,ヒアドキュメントは非効率に実装 されています.大きなヒアドキュメントを間違って扱うシェルもあります.例え ば,Solaris 8 dtkshksh M-12/28/93dで提供されていて, ヒアドキュメントを1024バイトのバッファの境界で間違った変数の展開を生じま す.ユーザは一般的に,より速くより信頼性の高いシェルを使用して,これらの 問題を修正することが可能で,例えば,そのまま‘./configure’するのでは なく,コマンド‘bash ./configure’を使用します.

シェルによっては,単一の文の中にヒアドキュメントが多過ぎるとき,非常に非 効率になるものもあります.例えば,configure.acに以下のようなもの 含めたとします.

     if <cross_compiling>; then
       assume this and that
     else
       check this
       check that
       check something else
       ...
       on and on forever
       ...
     fi

シェルは,その中のそれぞれのヒアドキュメントに対して一時ファイルを作成し ながら,if/fiの文脈全体をパースします.forkごとにそ のようなヒアドキュメントに対してリンクを作成するシェルもあり,インストー ルされた後のクリーンアップコードで正しく削除されます.それは,シェルが永 久に受け入れられるリンクを作成しているのです.

if/fiの外部のテストを移動したり,複数のif/fi の文脈を作成したりすることで,かなり動作が改善されるでしょう.とにかく, こういった構成は,典型的なAutoconfの使用では正しくありません.実際,M4マ クロは,シェルの条件文を見ることができないので,それは推奨されておらず, 条件分岐の前にそれが展開され,実行時に条件文が失敗だと分かるとき,マクロ 展開に失敗するかもしれず,マクロの実行を完全に終了できないでしょう.