LoginSignup
62
47

More than 3 years have passed since last update.

低機能でポータブルなテンプレートエンジンが欲しい→そこでenvsubstですよ

Last updated at Posted at 2016-09-18

Unixコマンドラインで動くテンプレートエンジンが欲しい、変数置換さえできれば良い、ということがたまにあります。たとえば、CI中にCIサーバ上にJSONファイルを作りたいが、一部の値は環境変数経由で動的に与えたい、なんてことがあるわけです。

m4を使うこともできなくはないですが、牛刀をもって何とかって奴ですよね(そもそもm4よく知らないし)。そこでenvsubstですよ。

envsubstはgettext付属のツールで、簡単な環境変数展開を行います。展開対象は$FOO${FOO}の2パターンのみです。デフォルト値の指定(${FOO-BAR})すら対応していません。

利用例

たとえばこんなファイルがあったときに

descriptor.json.in
{
    "version": {
        "name": "${VERSION}",
        "released": "${DATE}",
        "vcs_tag": "${VERSION}"
    }
}

こんな風に実行すると

$ VERSION=trunk DATE=$(date +%Y-%m-%d) envsubst < descriptor.json.in > descriptor.json

こんな結果が得られます。

descriptor.json
{
    "version": {
        "name": "trunk",
        "released": "2016-09-18",
        "vcs_tag": "trunk"
    }
}

簡単ですね!

テンプレート中に変数展開したくない文字列を含んでいる場合

テンプレート中に未定義の変数があった場合は置換されずそのまま残ります。

逆に、テンプレートファイルに$PATHのような表現が含まれていてかつ変数展開せずに残したいような場合は、envsubstの第一引数で展開対象の変数を絞り込むことができます。

envsubst '$FOO $BAR $BAZ ...'

1引数しか受け取らない上に展開したい変数名を$つきで全列挙するという男前仕様なので、シングルクォートでクォーティングするのが良いでしょう。スペースは空けても空けなくても大丈夫です。

普通のテンプレートエンジンだと$のエスケープ方法を提供しそうな気がしますが、envsubstにはエスケープ文字という概念がそもそもありません。シンプルで良いですね。

62
47
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
62
47