Environment variables 地形不';t在fish中加载环境变量集

Environment variables 地形不';t在fish中加载环境变量集,environment-variables,terraform,fish,terraform-provider-aws,Environment Variables,Terraform,Fish,Terraform Provider Aws,在我的项目的根文件夹main.tf旁边,我有一个名为load_env.fish的脚本,其中包含以下两行: set -U AWS_SHARED_CREDENTIALS_FILE "~/path/to/file" set -U AWS_PROFILE "my_profile" 我运行它,然后运行命令terraformimportfoobar。它让我访问被拒绝 但是,如果我使用bash而不是fish,并且设置了相同的环境变量,那么terraformimportfoobar就可以工作了 如果我这样做,

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

set -U AWS_SHARED_CREDENTIALS_FILE "~/path/to/file"
set -U AWS_PROFILE "my_profile"
我运行它,然后运行命令
terraformimportfoobar
。它让我
访问被拒绝

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

如果我这样做,我甚至可以让它在鱼身上工作:

  • 在bash中,设置环境变量
  • 从bash启动鱼壳
  • 现在在鱼壳中,运行terraform import foo bar
  • 所以

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

    如何在fish shell中使用
    terraform
    ,而不必打开嵌套的bash和fish shell?

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

    我只是简单地将
    set-U…
    的所有实例更改为
    set-Ux…
    ,一切正常

    编辑:在了解了
    set-Ux
    的缺点并阅读了更多内容后,我现在意识到fish与bash一样拥有
    source
    命令。所以,在脚本中,我可以使用

    set -x foo bar
    
    那我就可以了

    $ source load_env.fish
    
    而不仅仅是

    $ ./load_env.fish
    

    当从fish运行时,
    aws sts获取调用方标识显示了什么?导出通用变量几乎总是一个坏主意。首先,考虑当您在shell 1中更改var时,shell 2将看到该更改,但是它不会影响由任何shell启动的任何进程继承的var的值。其次,将var设置为“通用”意味着您无法在一个shell会话中更改它(例如,进行实验),而不会影响所有其他shell会话。不要导出UVAR。