kakakakakku blog

Weekly Tech Blog: Keep on Learning!

Shell で「テンプレートエンジン」のような仕組みを実現できる envsubst コマンド

少し前に 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.

echoenvsubst を組み合わせる

まず,以下のように名前を ${NAME} として環境変数にした文字列を作成し,echo で標準出力をすると,そのまま出力される.

$ echo 'Hello ${NAME}'
Hello ${NAME}

次に,export で環境変数を設定して,標準出力を envsubst に流すと,${NAME} の部分が変数展開される.これは便利!

$ export NAME=kakakakakku
$ echo 'Hello ${NAME}' | envsubst
Hello kakakakakku

テンプレートファイルと envsubst を組み合わせる

検証用のテンプレートファイル profile.yaml.template を作成する.namebloggithub を 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 で「テンプレートエンジン」のような仕組みを実現できる
  • 設定ファイルを生成するときなどに使えて便利!