config/env ファイルの変数にプレフィックスを追加する方法

config/env ファイルの変数にプレフィックスを追加する方法

私は次のような状況にあります。

source local.env
run_my_app

には、次のように具体的local.envに関連する環境変数がたくさんありますrun_my_app

es_protocol="http"
es_host=0.0.0.0
es_port=9200

mongo_protocol=mongodb+srv
mongo_host=foo.cluster.mongodb.net
mongo_port=80
mongo_user=foo

rabbit_protocol=ampq
rabbit_host=foo.rabbitmq.svc.cluster.local
rabbit_port=5672
rabbit_user=rabbitmq

ファイル内のすべての変数に重複して騒々しいプレフィックスを追加する代わりに、次のようにmy_appシェルプログラムを使用してプレフィックスを追加したいと思います。

source <(add_var_prefix 'my_app' local.env)  ## *note below

add_var_prefix次の2つのことを行うBash関数を実装する方法を知っている人はいますか?

  1. local.envファイル内のすべての変数にプレフィックスを追加する
  2. 変数をインポートする代わりに変数をエクスポートする
  • source <(xyz)何らかの奇妙な理由で、ソースコードがプロセスの交換で動作しないため、これは機能しません。

答え1

以下は簡単な解決策ですsed

source <(sed 's/[^=]\+=/export my_app_&/' local.env)

私は、等号を含むすべての行が変数の割り当てであると仮定し、複数行の変数や同じ行の複数の割り当てなどの素晴らしい形式を考慮していないので、これを「素朴」と呼びます。

答え2

#正規表現が行の先頭にあるコメントを識別する@xhienneの答えに少し追加した場合、一部のQED演習ではこの手法を使用してソーシングとエクスポートの両方を示します。

新鮮な殻から:

$ set | grep prefix
$ bash -l
$ prefix=my_prefix
$ source <(sed -Ee "s/^([^#])/${prefix}_\1/" local.env)

これで、私の環境に「prefix」と一致する複数の行があることを確認できます。

$ set | grep prefix
my_prefix_es_host=0.0.0.0
my_prefix_es_port=9200
my_prefix_es_protocol=http
my_prefix_mongo_host=foo.cluster.mongodb.net
my_prefix_mongo_port=80
my_prefix_mongo_protocol=mongodb+srv
my_prefix_mongo_user=foo
my_prefix_rabbit_host=foo.rabbitmq.svc.cluster.local
my_prefix_rabbit_port=5672
my_prefix_rabbit_protocol=ampq
my_prefix_rabbit_user=rabbitmq
prefix=my_prefix

サブシェルを開き、次の変数がエクスポートされていないことを再確認してください。

$ bash -l
$ set | grep prefix
$ ^D
logout
$ ^D
logout

きれいなシェルに戻る:

$ set | grep prefix
$ bash -l
$ prefix=my_prefix

今回は、次の変数をすべてエクスポートします。

$ source <(sed -Ee "s/^([^#])/export ${prefix}_\1/" local.env)

これは親シェルにあります。

$ set | grep prefix
my_prefix_es_host=0.0.0.0
my_prefix_es_port=9200
my_prefix_es_protocol=http
my_prefix_mongo_host=foo.cluster.mongodb.net
my_prefix_mongo_port=80
my_prefix_mongo_protocol=mongodb+srv
my_prefix_mongo_user=foo
my_prefix_rabbit_host=foo.rabbitmq.svc.cluster.local
my_prefix_rabbit_port=5672
my_prefix_rabbit_protocol=ampq
my_prefix_rabbit_user=rabbitmq
prefix=my_prefix

サブシェルを開くと、そこにも変数が表示されます。

$ bash -l
$ set | grep prefix
my_prefix_es_host=0.0.0.0
my_prefix_es_port=9200
my_prefix_es_protocol=http
my_prefix_mongo_host=foo.cluster.mongodb.net
my_prefix_mongo_port=80
my_prefix_mongo_protocol=mongodb+srv
my_prefix_mongo_user=foo
my_prefix_rabbit_host=foo.rabbitmq.svc.cluster.local
my_prefix_rabbit_port=5672
my_prefix_rabbit_protocol=ampq
my_prefix_rabbit_user=rabbitmq
$ ^D
logout
$ ^D
logout

関連情報