Unixコマンドラインで動くテンプレートエンジンが欲しい、変数置換さえできれば良い、ということがたまにあります。たとえば、CI中にCIサーバ上にJSONファイルを作りたいが、一部の値は環境変数経由で動的に与えたい、なんてことがあるわけです。
m4を使うこともできなくはないですが、牛刀をもって何とかって奴ですよね(そもそもm4よく知らないし)。そこでenvsubstですよ。
envsubstはgettext付属のツールで、簡単な環境変数展開を行います。展開対象は$FOO
と${FOO}
の2パターンのみです。デフォルト値の指定(${FOO-BAR}
)すら対応していません。
利用例
たとえばこんなファイルがあったときに
{
"version": {
"name": "${VERSION}",
"released": "${DATE}",
"vcs_tag": "${VERSION}"
}
}
こんな風に実行すると
$ VERSION=trunk DATE=$(date +%Y-%m-%d) envsubst < descriptor.json.in > descriptor.json
こんな結果が得られます。
{
"version": {
"name": "trunk",
"released": "2016-09-18",
"vcs_tag": "trunk"
}
}
簡単ですね!
テンプレート中に変数展開したくない文字列を含んでいる場合
テンプレート中に未定義の変数があった場合は置換されずそのまま残ります。
逆に、テンプレートファイルに$PATH
のような表現が含まれていてかつ変数展開せずに残したいような場合は、envsubst
の第一引数で展開対象の変数を絞り込むことができます。
envsubst '$FOO $BAR $BAZ ...'
1引数しか受け取らない上に展開したい変数名を$
つきで全列挙するという男前仕様なので、シングルクォートでクォーティングするのが良いでしょう。スペースは空けても空けなくても大丈夫です。
普通のテンプレートエンジンだと$
のエスケープ方法を提供しそうな気がしますが、envsubstにはエスケープ文字という概念がそもそもありません。シンプルで良いですね。