こんにちは。サービスシステムグループの伊達です。
今回はenvsubstについてご紹介したいと思います。
envsubstって
環境変数の値で$hoge ${hoge} を置換する機能を持っているため、テキストの設定ファイルやシェルスクリプトの簡易テンプレートエンジンとして使われることが多いコマンドです。
が、 yum install gettextでインストールすることから分かるように元々gettextというツールの一部です。
gettextとは
GNUのM17N(Multilingualization; 多言語化)のためのツールキットです。
ja.poやja.moのようなファイル名を見たことはありませんでしょうか。これがgettextの日本語用の言語ファイルです。
gettextを使うとプログラム中の文字列を多言語化できます。
gettextの使用例
例えば以下のような文字列を出力するプログラムがあるとします。英語話者以外には意味のないプログラムです。
1 2 |
puts("hello world") |
これをgettextを使って多言語化するにはこうします(gettextのライブラリはロードしておくとする)。
1 2 |
puts(_("hello world")) |
gettext一般では _() という関数が定義され、多言語化したい文字列をラップします。
- ソースコードに _() をつける
- xgettextコマンドでソースから対象の文字列を抽出する → .pot ファイルができる
- .potは翻訳用ファイルのテンプレートです
123msgid "hello world"msgstr "" - msginitコマンドで各言語用のpoファイルを作る
- 日本語だとja.po
123msgid "hello world"msgstr "" - ja.poに翻訳文を書き込む
123msgid "hello world"msgstr "こんにちは世界"
- msgfmtコマンドでバイナリ化する → ja.mo ファイルができる
- プログラム実行時にgettextがロケールに合わせた.moを読み込んで多言語化してくれる
- イメージです
1234567puts(_("hello world"))$ LANG="C" ruby hoge.rbhello world$ LANG="ja_JP.UTF-8" ruby hoge.rbこんにちは世界
再びenvsubst
envsubstの本来の使い方はシェルスクリプト用のgettextのコマンドの一部です。
詳しくは以下を読んでください。
envsubstの本来の使い方はシェルスクリプト用のテンプレートエンジンではない – Qiita
簡易テンプレートエンジンとしてのenvsubst
ユースケース
- Dockerfileをビルドしたい環境に合わせてCIのときに書き換えたい
- 要件上EC2インスタンスしか使えないシステムで一つだけ短いスクリプトを実行せざるを得なく、APIのパスワードは直接書きたくないし、環境ごとに値を変えたい
後者の実例として、私の担当プロダクトではシェルスクリプト中のID、PASSを書き換えたいのでenvsubstをGitHub Actionsのワークフローで使っています。
まとめ
envsubstは本来gettextの一部として開発されたツールですが、環境変数による置換機能の便利さから簡易テンプレートエンジンとして広く使われるようになりました。
用途に応じて適切に使い分けることで、設定ファイルの管理やCI/CDパイプラインでの動的な値の置換など、様々な場面で活用できる便利なツールです。
知っておくと、いざという時に役立つかもしれません。