我有这样的情况:
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
可以做两件事:
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)
我现在可以确认我的环境有几行与“前缀”匹配的内容:
$ 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