私は次のような状況にあります。
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関数を実装する方法を知っている人はいますか?
local.env
ファイル内のすべての変数にプレフィックスを追加する- 変数をインポートする代わりに変数をエクスポートする
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