Bash 스크립트가 있고 z="y=x" 형식의 문자열을 분리하여 값이 "x"인 환경 변수를 eval $z
만드는 데 사용할 수 있도록 노력하고 있습니다 . y
이것은 내 코드입니다.
xxx=$(terraform state show aws_s3_bucket.prod_bucket | grep website_endpoint | sed 's/ //g')
echo $xxx
>>>website_endpoint="my-site.s3-website-us-east-1.amazonaws.com"
eval $xxx
>>>-bash: website_endpoint=my-site.s3-website-us-east-1.amazonaws.com: command not found
이 코드의 실패로 인해 혼란스러운 점은 파일 내용을 .env
작업 환경 변수로 변환하는 것과 매우 유사한 작업을 수행한다는 것입니다.
cmd=$(sed -ne '/^#/d; /^export / {p;d}; /.*=/ s/^/export / p' .env)
eval $cmd ### works!
왜 후자는 작동하고 전자는 작동하지 않습니까?
편집: 이제 문제는 bash가 아닌 terraform에 있다는 것을 확인했으므로 이를 반영하기 위해 제목을 변경했습니다.
답변1
좋아요, 이게 어디로 가는지 알아요. 기본적으로 terraform state show
명령에는 색상, 굵게 등과 같은 이스케이프 문자가 포함됩니다. 불행히도 이러한 문자는 터미널에 전혀 표시되지 않습니다. 이상하게도 실제로 무엇이든 인쇄할 때마다 눈에 보이는 효과가 꺼지는 것처럼 보이기 때문입니다! 내 경우에는 $xxx는 다음과 같습니다.
[1m[0mwebsite_endpoint[0m[0m="magnus-misc-v2.s3-website-us-east-1.amazonaws.com"
... [0m
모든 서식과 색상을 제거하면 재즈가 내 노래를 망칠 것이라는 시각적인 단서가 없습니다 eval
. 그래서 내 해결책은 그 terraform state show -no-color
플래그를 사용하는 것이었습니다. 실제로 bash 문제는 아니지만 terraform CLI에서 혼란스러운 문제가 있습니다.
답변2
다음을 나타내는 문자열이 있을 때마다끈변수 할당은 이 할당을 수행하는 안전하고 간단한 방법입니다 declare
.더 많은 인용문 사용™):
$ xxx='website_endpoint="my-site.s3-website-us-east-1.amazonaws.com"'
$ declare "$xxx"
$ echo "$website_endpoint"
"my-site.s3-website-us-east-1.amazonaws.com"