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


19

私がつまずいたとき、envsubst特定の変数のみを置き換えるためにそれを使用したかったので、SHELL-FORMATパラメータが必要なものではないかと疑っていましたが、動作させることができませんでした。

残念ながら、maninfoページには使用例がなく、言うだけです

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

どのようにそれらを参照するかを教えてくれません。

回答:


20

テキストで示されているように、通常のシェルコマンドのように変数を参照する(たとえば、$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で述べたように、stdinput が存在するenvsubst場合--variablesは処理しません。


7

適切に使用する方法を理解するのに役立ついくつかの例を次に示します。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が存在することを知っているだけで、それを宣言する方法がわからないので、これらの例を読んだ後に非常に役立ちます!
zw963

0

言葉遣いは少し混乱しています。ヘルプテキストをより細かく言い換えるには:

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.