#簡易テンプレートエンジン
簡易テンプレートエンジンを作りました。
テンプレートエンジンというのはおおげさですが、「テンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力する」という要件を満たしています。 ※ wikipediaテンプレートエンジン
最初に種明かしをすると、実装は、catのヒアドキュメントにテンプレートを埋め込んでいるだけです。
なお、ヒアドキュメントは「コマンド置換」も行われますので、使用するときは注意が必要です。
#使用方法
#####【実行】
【テンプレートを引数で指定する】
extcat [file [file]...]
【テンプレートを標準入力に流し込む】
cat file | extcat
#####【テンプレートファイルの例】
日付:`date +"%Y %m/%d"`
場所:$(cd /tmp;pwd)
HOSTNAME:${HOSTNAME}
SHELL:${SHELL}
TERM:${TERM}
LANG:${LANG}
#####【実行結果】
日付:2018 04/15
場所:/tmp
HOSTNAME:localhost.localdomain
SHELL:/bin/bash
TERM:xterm
LANG:ja_JP.UTF-8
#実装
#!/bin/sh
cat <<^D | sh
cat <<^D2
`cat $@`
^D2
^D
この実装は大概のshで動きます。
ヒアドキュメントのデリミタ^Dは「こんととろーるでぃー、EOT(0x04)」ですが、文字「^」と文字「D」からなる文字列「^D」でも動きます。
いずれにしても、デリミタの行と同じ内容はヒアドキュメントの途中に書けません。ヒアドキュメントの終了と見なされるからです。
#!/bin/bash
bash <<< "cat <<< "\""$(cat $@)"\"""
この実装は、ヒアドキュメントの代わりにヒアストリングを使用しています。動作確認はbashで行いました。
function extcat () { cat $@ | bash <<< "cat <<< "\""$(cat)"\""" ; };export -f extcat
この実装は、bashのfunction版です。bashのプロンプトで実行すれば、スクリプトを配置しなくても使えます。
#どうでもいい話
extcatは当初Bourne shellで作りました。
以下はオリジナルバージョンです。
#!/bin/sh
cat <<^D | sh
cat <<^D
`cat $@`
Bourne shellのヒアドキュメントは、デリミタまたは「ファイルの終了」で終わるため、デリミタを省略することができました。※solaris10のshで確認
cat <<^D | sh
は sh <<^D
と書いても機能は同じです。むしろ立ち上がるプロセスが1個少なくなるので、こちらの方がよい実装です。
ただ、cat3行が並ぶ姿が美しく、こちらの方を使っていました。
以上どうでもよい話でした。
#環境
ホスト Windows10 COREi7
VM VirtualBox バージョン 5.2.8 r121009 (Qt5.6.2)
CentOS Linux release 7.4.1708 (Core)
3.10.0-693.21.1.el7.x86_64 #1 SMP Wed Mar 7 19:03:37 UTC 2018
GNU bash, バージョン 4.2.46(2)-release (x86_64-redhat-linux-gnu)