1. 概要

多くの場合、テンプレート、構成、または初期化ファイルは、bash変数の名前をプレースホルダーとして保持します。

したがって、実際に使用する前に変数の値を入力する必要があります。

envsubstコマンドを使用してそれを行う方法を学習します。

2. envsubstの基本機能

envsubst コマンドは、入力でパターン $VARIABLEまたは${VARIABLE}を検索します。 次に、パターンを対応するbash変数の値に置き換えます。

対照的に、変数を参照しないパターンは空の文字列に置き換えられます。

さらに、 envsubstは、エクスポートされた変数のみを認識します。

このコマンドは、GNU’gettext’パッケージの一部です。 その基本的な構文は次のとおりです。

envsubst [OPTION] [SHELL-FORMAT]

3. 使用例

ファイルwelcome.txtに簡単な挨拶テンプレートを用意しましょう。 その名前でユーザーにアドレスを指定し、デスクトップセッションの名前を追加して、特定の挨拶をします。

Hello user $USER in $DESKTOP_SESSION. It's time to say $HELLO!

HELLO変数をエクスポートしてみましょう。

$ export HELLO="good morning"
$ envsubst < welcome.txt
Hello user joe in Lubuntu. It's time to say good morning!

それでは、この変数をunsetしましょう。

$ unset HELLO
$ envsubst < welcome.txt
Hello user joe in Lubuntu. It's time to say !

4. SHELL-FORMATで変数を指定する

SHELL-FORMAT 引数は、置換する変数を選択します。

つまり、この引数で言及されている変数のみが置き換えられます。 他のすべての変数およびドル記号を含む他のすべての単語は変更されません。

可変パターンは、コマンド入力の場合と同じです– $VARIABLEまたは${VARIABLE}

shell_format_test.txt入力ファイルをチェックしてみましょう。

This is $FOO and this $BAR

また、FOOBARの2つの変数を設定してエクスポートしましょう。

$ export FOO=foo export BAR=bar

ここで、FOOのみを置き換えます。

$ envsubst '$FOO' < shell_format_test.txt
This is foo and this $BAR

SHELL-FORMAT のコンテンツの前後にアポストロフィを使用して、envsubstを呼び出す前に変数が置換されないようにする必要があります。

5. SHELL-FORMATのフォーマット

SHELL-FORMATの構造は非常に柔軟であることに注意してください。 たとえば、変数は区切りリストを形成する場合があります。

$ envsubst '$FOO,$BAR' < shell_format_test.txt
This is foo and this bar

または、任意のテキストの一部にすることができます。

$ envsubst 'Please deal with $FOO and $BAR'< shell_format_test.txt
This is foo and this bar

可変パターンには、英数字のASCII文字とアンダースコアのみを含める必要があり、数字で始めることはできません。

6. すべての環境変数を置き換える

例として、welcome.txtテンプレートファイルにあるすべての環境変数を置き換えましょう。

$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" < welcome.txt
Hello user joe in Lubuntu. It's time to say $HELLO!

それでは、SHELL-FORMAT引数を分析してみましょう。

まず、 env コマンドは、変数とその値のリストをペアで提供します。 次に、各ペアをカットして、変数の名前を抽出します。

最後に、 printf はこの名前を中括弧に入れ、先頭にドル記号を追加します。

7. SHELL-FORMATのコンテンツの一覧表示

-vまたは–variables スイッチを使用して、SHELL-FORMAT引数に存在するすべての変数を出力してみましょう。 このオプションでは、実際の置換は行われません。

それでは、すべての環境変数の名前をかなり凝った方法で印刷しましょう(xargscolumnの助けを借りて):

$ envsubst "$(printf '${%s} ' $(env | cut -d'=' -f1))" --variables | xargs -L4 | column -t
XDG_VTNR               LC_PAPER                  LC_ADDRESS           XDG_SESSION_ID
XDG_GREETER_DATA_DIR   SELINUX_INIT              LC_MONETARY          SAL_USE_VCLPLUGIN
CLUTTER_IM_MODULE      SESSION                   GPG_AGENT_INFO       TERM
...

8. 結論

この記事では、envsubstコマンドの詳細について説明しました。 さらに、その使用例を検討しました。

最後に、 envsubst を使用して、テキストファイル内のすべての参照環境変数をシェル環境からの対応する値に置き換える方法を示しました。