web-dev-qa-db-ja.com

envsubstのShell-FORMATとは何ですか?

envsubstを偶然見つけたとき、特定の変数のみを置き換えるためにそれを使用したいと思い、Shell-FORMATパラメーターが必要なものであるかもしれないと思ったが、それを機能させることができなかった。

残念ながら、manページとinfoページには使用例はなく、

Shell-FORMATが指定されている場合、Shell-FORMATで参照される環境変数のみが置換されます

それらを参照する方法を教えてくれません。

21
Nobody

テキストで示されているように、通常のシェルコマンドと同じように、変数を参照する必要があります(たとえば、$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を処理しません。

22
Nobody

以下は、適切に使用する方法を理解するのに役立ついくつかの例です。 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の意味も理解できませんでしたが、なぜこのような名前が付けられているのかはわかりません。しかし、上記の実験の結果、私はそれが何をするのか知っていると思います。

9
dedeibel

言い回しは少し混乱しています。ヘルプテキストをより注意深く言い換えるには:

Shell-FORMATは、環境変数への参照を含むオプションのテキストコマンドライン引数です。テキストで環境変数を参照するには、変数名の前に$を付けます。たとえば、Hello $FOO World $BARは環境変数FOOおよびBARを参照します。文字列の残りは無視されます。 Shell-FORMATコマンドライン引数が存在する場合、stdinを介して受信したテキストで変数置換が行われると、Shell-FORMATコマンドライン引数で参照される変数に限定されます。

したがって、質問に明示的に回答するには、変数名の前に$を付けます。

2
wizulus