【问题标题】:terraform doesn't load environment variables set in fishterraform 不加载在 fish 中设置的环境变量
【发布时间】:2019-09-11 12:24:09
【问题描述】:

在我项目的根文件夹main.tf 旁边,我有一个名为load_env.fish 的脚本,其中包含这两行:

set -U AWS_SHARED_CREDENTIALS_FILE "~/path/to/file"
set -U AWS_PROFILE "my_profile"

我运行它,然后运行命令terraform import foo bar。它给了我Access Denied

但是,如果我使用 bash 而不是 fish,并且设置了相同的环境变量,那么 terraform import foo bar 可以工作。

如果我这样做,我什至可以让它在鱼中工作:

  1. 从 bash,设置环境变量
  2. 从 bash 启动鱼壳
  3. 现在在鱼壳中,运行terraform import foo bar

所以,

如果我使用 bash 而不是 fish,为什么它会起作用?如果从设置了正确环境变量的 bash shell 打开 fish shell,为什么它可以在 fish 中工作?

如何在fish shell 中使用terraform 而无需打开嵌套的bash 和fish shell?

【问题讨论】:

  • aws sts get-caller-identity 从鱼跑时显示什么?

标签: environment-variables terraform fish terraform-provider-aws


【解决方案1】:

Universal variables 在所有鱼会话之间共享,但它们不会自动导出到子进程

我只是将set -U ... 的所有实例更改为set -Ux ...,一切正常。

编辑:在看到KurtisRader's comment 关于set -Ux 的缺点并阅读更多内容后,我现在意识到fish 像bash 一样具有source 命令。所以,在脚本中我可以使用

set -x foo bar

那我可以

$ source load_env.fish

而不仅仅是

$ ./load_env.fish

【讨论】:

  • 导出通用变量几乎总是一个坏主意。首先,请考虑当您更改 shell #1 中的 var 时,shell #2 将看到更改,但它不会影响任何一个 shell 已经启动的任何进程继承的 var 的值。其次,通过使 var “通用”,这意味着您不能在一个 shell 会话中更改它(例如,做一个实验)而不影响所有其他 shell 会话。 不要导出 uvar。
猜你喜欢
  • 2014-10-27
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 2016-08-06
  • 2021-02-18
相关资源
最近更新 更多