나는 다음과 같은 상황에 처해 있습니다.
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
다음 두 가지 작업을 수행하는 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