如何将 `terraform state show` 输出通过管道传输到 bash 变量?

如何将 `terraform state show` 输出通过管道传输到 bash 变量?

我有一个 bash 脚本,我试图隔离 z="y=x" 形式的字符串,以便我可以使用它eval $z来创建y值为“x”的环境变量。这是我的代码:

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!

为什么后者有效而前者无效?

编辑:现在我已经确定问题出在 terraform 而不是 bash,我更改了标题以反映这一点

答案1

好吧,我知道这是怎么回事了。默认情况下,该terraform state show命令将包含颜色、加粗等转义字符。不幸的是,这些字符根本不会显示在终端中,因为奇怪的是,每当它实际打印任何内容时,它们似乎都会关闭任何可见效果!所以就我而言,$xxx 看起来像这样:

[1m[0mwebsite_endpoint[0m[0m="magnus-misc-v2.s3-website-us-east-1.amazonaws.com"

...由于[0m删除了所有格式和颜色,我没有任何视觉线索表明爵士乐在那里扰乱了我的eval-ing。所以我的解决方法是使用该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"

相关内容