1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

タイトルに書いてある通りなのですが、envsubst を使って環境変数の埋め込みを行っていたところ、何度やっても埋め込みに失敗し、解決はできたものの無駄に苦戦してしまいました。

何が起きたのか?

app.envというファイルを用意します。

app.env
NAME=hoge

hoge.txt.templateというテンプレートを用意します。

hoge.text.template
Hello, ${NAME}.

run.shというスクリプトを用意し、この中で envsubst を使ってNAMEの値を埋め込みます。

run.sh
#!/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にあります。

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 を利用される方の参考になりますと幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?