Blog

envsubstはテンプレートエンジンではないが役に立つ

こんにちは。サービスシステムグループの伊達です。

今回はenvsubstについてご紹介したいと思います。

envsubstって

環境変数の値で$hoge ${hoge} を置換する機能を持っているため、テキストの設定ファイルやシェルスクリプトの簡易テンプレートエンジンとして使われることが多いコマンドです。

が、 yum install gettextでインストールすることから分かるように元々gettextというツールの一部です。

gettextとは

GNUのM17N(Multilingualization; 多言語化)のためのツールキットです。

ja.poやja.moのようなファイル名を見たことはありませんでしょうか。これがgettextの日本語用の言語ファイルです。

gettextを使うとプログラム中の文字列を多言語化できます。

gettextの使用例

例えば以下のような文字列を出力するプログラムがあるとします。英語話者以外には意味のないプログラムです。

これをgettextを使って多言語化するにはこうします(gettextのライブラリはロードしておくとする)。

gettext一般では _() という関数が定義され、多言語化したい文字列をラップします。

  1. ソースコードに _() をつける
  2. xgettextコマンドでソースから対象の文字列を抽出する → .pot ファイルができる
    • .potは翻訳用ファイルのテンプレートです

  3. msginitコマンドで各言語用のpoファイルを作る
    1. 日本語だとja.po

  4. ja.poに翻訳文を書き込む

  5. msgfmtコマンドでバイナリ化する → ja.mo ファイルができる
  6. プログラム実行時にgettextがロケールに合わせた.moを読み込んで多言語化してくれる
    • イメージです

再びenvsubst

envsubstの本来の使い方はシェルスクリプト用のgettextのコマンドの一部です。

詳しくは以下を読んでください。

envsubstの本来の使い方はシェルスクリプト用のテンプレートエンジンではない – Qiita

簡易テンプレートエンジンとしてのenvsubst

ユースケース

  • Dockerfileをビルドしたい環境に合わせてCIのときに書き換えたい
  • 要件上EC2インスタンスしか使えないシステムで一つだけ短いスクリプトを実行せざるを得なく、APIのパスワードは直接書きたくないし、環境ごとに値を変えたい

後者の実例として、私の担当プロダクトではシェルスクリプト中のID、PASSを書き換えたいのでenvsubstをGitHub Actionsのワークフローで使っています。

まとめ

envsubstは本来gettextの一部として開発されたツールですが、環境変数による置換機能の便利さから簡易テンプレートエンジンとして広く使われるようになりました。

用途に応じて適切に使い分けることで、設定ファイルの管理やCI/CDパイプラインでの動的な値の置換など、様々な場面で活用できる便利なツールです。

知っておくと、いざという時に役立つかもしれません。

ニフティでは、
さまざまなプロダクトへ挑戦する
エンジニアを絶賛募集中です!
ご興味のある方は以下の採用サイトより
お気軽にご連絡ください!

ニフティに興味をお持ちの方は
キャリア登録をぜひお願いいたします!

connpassでニフティグループに
参加いただくと
イベントの
お知らせが届きます!