シェル - ヒアドキュメント

 クラウディア
1. 概要
2. 書き方
3. 変数展開させない
4. 折衷

1. 概要

 本ページは、下記のサイトを参考にさせていただきました。
知ると便利なヒアドキュメント」
「bash のヒアドキュメントを活用する
 ヒアドキュメントは、「ヒアドキュメント - Wikipedia」によれば、『ヒアドキュメント(別の呼び方としてヒア文字列、heredocなど)は、文字列リテラルを、シェルスクリプトやプログラミング言語のソースコード中に埋め込むための1つの方法である』ということだそうです。  シェルに限らず、標準入力(と特定するわけでもないようですが)から入力するべたな文字列を、テキストファイルに出力するための方法です。  わたしは、コンフィグレーションファイルの末尾に複数の行を追加するときに多用しています。

2. 書き方

 わたしの使う基本的な書き方は

cat << EOF >> パス/ファイル名
付け加える  行1
付け加える  行2
・・・
EOF
 で、「パス/ファイル名」の末尾に「EOF」までの行が追加されます。  リダイレクトの記号によって、追加なのかファイル自体を新規に書き直すのかは、ご存知の方には難しいことではないかと思います。  基本的には、「bash」でも「tcsh」でも同じコマンド記述ができます。  ちなみに「EOF」の文字列は便宜的に使用しているもので、開始行と終了行が対応していれば問題ないようです。  そうでないと、テキストとして出力したい行に文字列としての「EOF」があれば、それでおわっていまいますからね。

3. 変数展開させない

 わたしはよく、「bash」のプロンプトを

export PS1='\u@\h $PWD > '
 と書いて、プロンプトを

ユーザ名@ホスト名 /カレントパス >
 てな感じで表示させます(末尾の文字はまちまち)。  「tcsh」だと

set prompt = '%n@%M %/ > '
 ですな。  ところがこれ、例えば、「bash」で、「~/.bashrc」に設定しようと

cat << EOF >> ~/.bashrc
export PS1='\u@\h $PWD > '
EOF
 と書いちゃうと、例えば、「$PWD」が、「$PWD」と出力されるのでなく。  正に変数展開されて、そのときのカレントパスの文字列がべた書きされてしまうのです。  これは、困ったもんです。  これは、回避する方法がありました。  回避する方法が、「bash」と「tcsh」で異なるので、困っちゃうのですが・・・。  「bash」の場合

cat << 'EOF' >> パス/ファイル名

・・・	略	・・・

EOF
 「tcsh」の場合

cat << 'EOF' >> パス/ファイル名

・・・	略	・・・

'EOF'
 どちらも、開始行の「EOF」文字をコーテーションで囲むのですが・・・、「bash」の場合、末尾は囲まない、「tcsh」の場合、末尾も囲みます。

4. 折衷

 前項の変数展開させない書き方。  「bash」と「tcsh」で違いがあるので困っちゃう。  で、折衷策として、ヒアドキュメントを記述するときだけ、特に変数展開もさせないのであるから、「sh」を使うのがいいかと思います。  「sh」がはいっていない、「Unix」「Linux」は、まずないし、確実にパスも通っているはずです。  なので

sh
cat << 'EOF' >> パス/ファイル名

・・・	略	・・・

EOF
exit
 と書けば、「bash」向けであろうが、「tcsh」向けであろうが、テキストファイルとしてスクリプトを記述できるのであります。
ハイスピードプラン