Help us understand the problem. What is going on with this article?

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

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にはエスケープ文字という概念がそもそもありません。シンプルで良いですね。

hnw
境界値バグが大好物。自分の日記で書くには小ネタすぎるネタをQiitaに書いています。
https://hnw.hatenablog.com/
klab
モバイルオンラインゲーム、その他スマートフォン関連サービス、及びサーバーインフラ開発・運用
http://www.klab.com/jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした