タイトルに書いてある通りなのですが、envsubst を使って環境変数の埋め込みを行っていたところ、何度やっても埋め込みに失敗し、解決はできたものの無駄に苦戦してしまいました。
何が起きたのか?
app.env
というファイルを用意します。
NAME=hoge
hoge.txt.template
というテンプレートを用意します。
Hello, ${NAME}.
run.sh
というスクリプトを用意し、この中で envsubst を使ってNAME
の値を埋め込みます。
#!/bin/bash
# app.env を読み込む
source app.env
# NAME の値を埋め込む
envsubst < /path/to/hoge.txt.template > /path/to/hoge.txt
run.sh
を実行するとhoge.txt
ファイルが作成されます。
ファイルの中身は "Hello, hoge." を期待するのですが、実際は "Hello, ." となっており埋め込みに失敗しました。
失敗した原因
埋め込みに失敗した原因はapp.env
にあります。
NAME=hoge
export
が抜けているためNAME
は環境変数ではなくてシェル変数になっていました。
envsubst は環境変数の埋め込みを行うものなので、期待していた挙動にはならなかったという訳です。
ちなみに
export NAME=hoge
とすれば、環境変数としてNAME
を定義できます。
$ export NAME=hoge
$ envsubst < hoge.txt.template
Hello, hoge.
declare
コマンドを使うと、シェル変数を環境変数に変更したり、その逆ができます。
$ NAME=hoge
$ envsubst < hoge.txt.template
Hello, .
$ declare -x NAME # 環境変数に変更
$ envsubst < hoge.txt.template
Hello, hoge.
$ declare +x NAME # シェル変数に変更
$ envsubst < hoge.txt.template
Hello, .
また、コマンドラインの先頭でNAME=hoge
記述して、それに続けてコマンド(今回だとenvsubst
)を実行すると、一時的に環境変数の値を変えてコマンドが実行できるようになります。
$ printenv NAME
$
$ NAME=hoge envsubst < hoge.txt.template
Hello, hoge.
$ printenv NAME
$
さいごに
今となっては「何ですぐに(シェル変数だと)気づかなかったのだろう」の一言に尽きます。
これから envsubst を利用される方の参考になりますと幸いです。