envsubstの代入を防ぐ方法はあり$VARIABLEますか? たとえば、次のようなものを期待します。
export THIS=THAT
echo "dont substitute \\\$THIS" | envsubst
そして返してもらう
dont substitute $THIS
しかし、代わりに私は得る
dont substitute \THAT
これを行うためのエスケープ文字はありますか?
envsubst変数のリストを指定すると、それらの変数のみが置換され、他の置換は無視されます。それがどのように機能するのか正確にはわかりませんが、次のようなものがあなたが望むことをするようです:
$ export THIS=THAT FOO=BAR
$ echo 'dont substitute $THIS but do substitute $FOO' | envsubst '$FOO'
dont substitute $THIS but do substitute BAR
$THISはそのままですが、$FOOに置き換えられていることに注意してくださいBAR。
$ echo $SHELL
/bin/bash
$ echo \$SHELL
$SHELL
$ echo \$SHELL | envsubst
/bin/bash
$ echo \$\${q}SHELL | envsubst
$SHELL
そうすることで、キャラクター$$を追加することができます。$次に、存在しない変数を「置換」するだけです(ここでは使用${q}しましたが、より意味のあるものにすることができ、${my_empty_variable}必要なものが得られます.
段落の解決策と同じように、何か特別なものが必要です-ここでは... 存在しない変数です。これは、テンプレートで追加の sed を実行するよりも少し好きです。
gettextこれは、 1 つのプログラムのパッケージ全体をインストールする手間を省くため、私が使用する代替手段です。私はこの awk スクリプトを持っていenvtmplます{{ENV-VAR}}。ENV-VAR
#! /usr/bin/awk -f
{ for (a in ENVIRON) gsub("{{" _ a _ "}}",ENVIRON[a]); print }
そう
$ echo "My shell '{{SHELL}}' is cool" | envtmpl
My shell '/bin/bash' is cool
ご覧のとおり、{{&}}が好みのものでない場合は、実際に変更する必要があり、このスクリプトはbusybox'sで正常に動作しawkます。
これは世界最速のソリューションにはなりませんが、実装は非常に簡単で、主に構成ファイルを準備するために実行するので、速度はほとんど関係ありません。
警告: これと の唯一の大きな違いは、値が存在しない変数は変更envsubstされないことです。それは{{HAS-NO-VALUE}}正確にそのまま残され、 asenvsubstはそれらを削除します(空白に置き換えます)。
必要に応じて、 にさらにコードを追加することで、これを修正できますawk。