如何为来自 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,而是想使用 shell 程序添加前缀,如下所示:

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

有谁知道如何实现这样的 Bash 函数add_var_prefix可以做两件事:

  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)

我现在可以确认我的环境有几行与“前缀”匹配的内容:

$ 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

打开子 shell 并再次检查,确认没有导出这些变量:

$ 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)

它们位于父 shell 中:

$ 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

如果我们打开一个子 shell,变量也会出现在那里:

$ 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

相关内容