我有一个 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 中一些令人困惑的东西。