LoginSignup
1
1

More than 5 years have passed since last update.

簡易テンプレートエンジン extcat coneta #1

Posted at

簡易テンプレートエンジン

 簡易テンプレートエンジンを作りました。
 テンプレートエンジンというのはおおげさですが、「テンプレートと呼ばれる雛形と、あるデータモデルで表現される入力データを合成し、成果ドキュメントを出力する」という要件を満たしています。 ※ 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

実装

extcat(sh script version)
#!/bin/sh
 cat <<^D | sh
 cat <<^D2
`cat $@`
^D2
^D

 この実装は大概のshで動きます。
 ヒアドキュメントのデリミタ^Dは「こんととろーるでぃー、EOT(0x04)」ですが、文字「^」と文字「D」からなる文字列「^D」でも動きます。
 いずれにしても、デリミタの行と同じ内容はヒアドキュメントの途中に書けません。ヒアドキュメントの終了と見なされるからです。

extcat(bash script version)
#!/bin/bash
bash <<< "cat <<< "\""$(cat $@)"\"""

 この実装は、ヒアドキュメントの代わりにヒアストリングを使用しています。動作確認はbashで行いました。

extcat(bash function version)
function extcat () { cat $@ | bash <<< "cat <<< "\""$(cat)"\""" ; };export -f extcat

 この実装は、bashのfunction版です。bashのプロンプトで実行すれば、スクリプトを配置しなくても使えます。

どうでもいい話

 extcatは当初Bourne shellで作りました。
 以下はオリジナルバージョンです。

extcat(Bourne sh version)
#!/bin/sh
 cat <<^D | sh
 cat <<^D
`cat $@`

 Bourne shellのヒアドキュメントは、デリミタまたは「ファイルの終了」で終わるため、デリミタを省略することができました。※solaris10のshで確認

 cat <<^D | shsh <<^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)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1