envsubst
を偶然見つけたとき、特定の変数のみを置き換えるためにそれを使用したいと思い、Shell-FORMATパラメーターが必要なものであるかもしれないと思ったが、それを機能させることができなかった。
残念ながら、man
ページとinfo
ページには使用例はなく、
Shell-FORMATが指定されている場合、Shell-FORMATで参照される環境変数のみが置換されます
それらを参照する方法を教えてくれません。
テキストで示されているように、通常のシェルコマンドと同じように、変数を参照する必要があります(たとえば、$VARNAME
または${VARNAME}
)。ただし、シェルがそれらを事前に展開しないことを確認する必要があります。
これを説明するための例をいくつか示します(export FOO=BAR
を想定):
$ echo '$FOO$FOO2' | envsubst
BAR
ご覧のとおり、$ FOO2は定義されていないため、 ""に置き換えられています。次のようにして、その置換を$ FOOのみに制限できます。
$ echo '$FOO$FOO2' | envsubst '$FOO'
BAR$FOO2
""
の代わりに''
を使用すると、必要になる前に置換が行われます。
echo '$FOO$FOO2' | envsubst "$FOO"
$FOO$FOO2
(これは、変数を検出しないため、置き換えられない変数envsubst "BAR"
の効果的な呼び出しになります。)
man
- pageが言ったように、Shell-FORMAT
で参照されるすべての変数が置き換えられるため、次のようにすることもできます。
echo '$FOO$FOO2$FOO3' | envsubst '$FOO some more text ${FOO3}'
BAR$FOO2
ご覧のとおり、Shell-FORMAT
は非常に柔軟です。
最後に、パラメータ--variables
を使用すると、Shell-FORMAT
による置換用に選択されている変数を評価できます。
envsubst --variables '$FOO some more text ${FOO3}'
FOO
FOO3
上記の時期尚早の置換の例では、これはエラーを示していました:
$ envsubst --variables "$FOO"
(empty string returned)
man
- pageに記載されているように、--variables
が存在する場合、envsubst
はstdinputを処理しません。
以下は、適切に使用する方法を理解するのに役立ついくつかの例です。 envsubstonlyがパラメーターで言及された変数を置き換えるのは、私にとって驚くべきことでした。
$ export FOOX="foox"
$ export FOOY="fooy"
$ export FOOZ="fooz"
$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst
x foox y fooy z fooz
$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX'
x foox y $FOOY z $FOOZ
$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOX $FOOZ'
x foox y $FOOY z fooz
$ echo 'x $FOOX y $FOOY z $FOOZ' | envsubst '$FOOZ $FOOY'
x $FOOX y fooy z fooz
Shell-FORMATの意味も理解できませんでしたが、なぜこのような名前が付けられているのかはわかりません。しかし、上記の実験の結果、私はそれが何をするのか知っていると思います。
言い回しは少し混乱しています。ヘルプテキストをより注意深く言い換えるには:
Shell-FORMAT
は、環境変数への参照を含むオプションのテキストコマンドライン引数です。テキストで環境変数を参照するには、変数名の前に$
を付けます。たとえば、Hello $FOO World $BAR
は環境変数FOO
およびBAR
を参照します。文字列の残りは無視されます。Shell-FORMAT
コマンドライン引数が存在する場合、stdinを介して受信したテキストで変数置換が行われると、Shell-FORMAT
コマンドライン引数で参照される変数に限定されます。
したがって、質問に明示的に回答するには、変数名の前に$
を付けます。