環境変数の交換をしてみたいのですが、envsubst
特定の変数だけを交換したいです。
ドキュメントにはenvsubst
特定の変数だけを変更するように言えるはずですが、そうすることはできません。
たとえば、次のファイルを含む場合:
VAR_1=${VAR_1}
VAR_2=${VAR_2}
envsubst
ペアへの参照のみを置き換えるにはどうすればよいですか${VAR_1}
?
答え1
マニュアルページによると:
envsubst [OPTION] [SHELL-FORMAT]
SHELL-FORMATを指定すると、SHELL-FORMATで参照されている環境変数のみが置き換えられます。それ以外の場合は、標準入力に表示されるすべての環境変数参照が置き換えられます。
SHELL-FORMAT文字列はどこにありますか?$variable
" [...]形式のシェル変数の文字列参照変数名には、${variable}
英数字またはアンダースコアASCII文字のみを含める必要があり、数字で始めることはできず、空ではありません。そうしないと、その変数参照は無視されます。"。
この形式はサポートされ${VAR:-default}
ていません。私は言及しましたこここれをサポートするいくつかの代替手段やその他の機能もあります。
とにかく、次に戻りますgettext
envsubst
。
したがって、envsubst
その変数名はシェル形式の文字列として渡す必要があります(明らかに文字通りに渡すにはエスケープ/引用符を付ける必要がありますenvsubst
)。例:
入力ファイルの例infile
:
VAR1=${VAR1}
VAR2=${VAR2}
VAR3=${VAR3}
そして、次のようないくつかの値は
export VAR1="one" VAR2="two" VAR3="three"
その後実行
envsubst '${VAR1} ${VAR3}' <infile
または
envsubst '${VAR1},${VAR3}' <infile
または
envsubst '${VAR1}
${VAR3}' <infile
出力
VAR1=one
VAR2=${VAR2}
VAR3=three
またはバックスラッシュを好む場合:
envsubst \$VAR1,\$VAR2 <infile
生産する
VAR1=one
VAR2=two
VAR3=${VAR3}
カスタム設定変数が実行中のシェル環境に漏洩するのを防ぐには、これらの変数をエクスポートするのではなく、次の手順を実行します。いくつかの殻、例えば吹くプレフィックスコマンドの許可変数の割り当て。この方法で割り当てられた値はコマンドの実行にのみ使用され、後続のシェル環境には影響しません。
export VAR1="one" VAR2="two" VAR3="three"
# ...
VAR1="number 1" VAR3="numero 3" envsubst '${VAR1} ${VAR3}' <infile
# output:
# VAR1=number 1
# VAR2=${VAR2}
# VAR3=numero 3
echo "VAR1=${VAR1}"
echo "VAR2=${VAR2}"
echo "VAR3=${VAR3}"
# output shows that the original environment was preserved:
# VAR1=one
# VAR2=two
# VAR3=three
答え2
dockerに関連していますが、このユーティリティはそのenvplate
タスクを実行する必要があります。https://github.com/kreuzwerker/envplate
追加情報ファイルから:
環境キーを使用して構成ファイルを簡単にテンプレート化します。これらのキーへの参照は、すべての構成ファイルで次のように宣言できます。
${key} または
${キー:-デフォルト}
gnutextのenvsubstはでのみ置き換えられます${key}
。不足している場合に置き換えられます''
。
答え3
残念ながら、「エクスポート」は必須です。それ以外の場合は動作しません。ここに例があります。
まずファイルを入力します。私はNGINX_HOSTとNGINX_PORTだけを変更したいと思います。
$ egrep 'server_name|listen|try_files' nginx-default.conf.template
server_name ${NGINX_HOST};
listen ${NGINX_PORT};
try_files $uri $uri/ /index.php?$args;
今、空の変数は次のようになります。
$ echo ${NGINX_HOST}
$ echo ${NGINX_PORT}
次の変数のデフォルト値を設定します。
$ NGINX_HOST=${NGINX_HOST:-localhost}
$ NGINX_PORT=${NGINX_PORT:-80}
$ echo ${NGINX_HOST}
localhost
$ echo ${NGINX_PORT}
80
envsubstを試してください:
$ envsubst \
'${NGINX_HOST} ${NGINX_PORT}' \
< nginx-default.conf.template \
| egrep 'server_name|listen|try_files'
server_name ;
listen ;
try_files $uri $uri/ /index.php?$args;
ご覧のとおり動作しません。変数が正しく機能するためには、変数を「エクスポートする」必要があります。これは2回目の実行です。
$ export NGINX_HOST=${NGINX_HOST:-localhost}
$ export NGINX_PORT=${NGINX_PORT:-80}
$ envsubst '${NGINX_HOST} ${NGINX_PORT}' < nginx-default.conf.template | egrep 'server_name|listen|try_files'
server_name localhost;
listen 80;
try_files $uri $uri/ /index.php?$args;
ご覧のとおり、今動作します。それが他の人に役立つことを願っています。
答え4
を呼び出す前に変更を元にenvsubst
戻すには、単一引用符のエクスポートを使用する必要がありますVAR_1
。良い:
export VAR_1='somevalue'
詳細については、次を参照してください。