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
。