特定の変数のみをenvsubstに置き換える

特定の変数のみをenvsubstに置き換える

環境変数の交換をしてみたいのですが、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'

詳細については、次を参照してください。

複雑なテキストファイルでシェル変数を置き換える方法

関連情報