少し前に envsubst コマンドの存在を知った.envsubst コマンドを使うと,変数展開など,Shell で「テンプレートエンジン」のような仕組みを実現できる.例えば,設定ファイルを生成するときなどに使える.なぜ今まで知らなかったんだろう!と思うけど,今回は envsubst の紹介記事を書きたいと思う.
準備
例えば Amazon Linux 2 など,環境によって,最初から envsubst コマンドが使える場合もある.もしインストールする場合は gettext パッケージに含まれているため,yum などを使ってインストールする.
$ yum install -y gettext
$ which envsubst
/usr/bin/envsubst
Mac なら brew を使ってインストールできる.インストール後に brew link を実行することを忘れずに!
$ brew install gettext $ brew link --force gettext $ which envsubst /usr/local/bin/envsubst
なお envsubst コマンドの help を確認すると「環境変数の値を代入する」と記載されていた.
$ envsubst --help Usage: envsubst [OPTION] [SHELL-FORMAT] Substitutes the values of environment variables.
echo と envsubst を組み合わせる
まず,以下のように名前を ${NAME} として環境変数にした文字列を作成し,echo で標準出力をすると,そのまま出力される.
$ echo 'Hello ${NAME}' Hello ${NAME}
次に,export で環境変数を設定して,標準出力を envsubst に流すと,${NAME} の部分が変数展開される.これは便利!
$ export NAME=kakakakakku $ echo 'Hello ${NAME}' | envsubst Hello kakakakakku
テンプレートファイルと envsubst を組み合わせる
検証用のテンプレートファイル profile.yaml.template を作成する.name と blog と github を Key とし,Value に環境変数を指定したシンプルな YAML ファイルにする.
name: ${NAME} blog: ${BLOG_URL} github: ${GITHUB_URL}
検証用のテンプレートファイルを cat で標準出力をすると,そのまま出力される.
$ cat profile.yaml.template name: ${NAME} blog: ${BLOG_URL} github: ${GITHUB_URL}
次に,先ほどと同様に export で環境変数を設定して,検証用のテンプレートファイルを envsubst に流すと,Value の部分が変数展開される.環境ごとに異なる設定ファイルを生成できるようになった.これは便利!
$ export NAME=kakakakakku $ export BLOG_URL=https://kakakakakku.hatenablog.com $ export GITHUB_URL=https://github.com/kakakakakku $ cat profile.yaml.template | envsubst name: kakakakakku blog: https://kakakakakku.hatenablog.com github: https://github.com/kakakakakku
なお,ファイルと組み合わせる場合は cat を使わずに,直接流し込むこともできる.
$ envsubst < profile.yaml.template
name: kakakakakku
blog: https://kakakakakku.hatenablog.com
github: https://github.com/kakakakakku
まとめ
envsubstコマンドを使うと,Shell で「テンプレートエンジン」のような仕組みを実現できる- 設定ファイルを生成するときなどに使えて便利!