You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本条件设置全局AWS密钥环境变量不生效问题求解

问题

我想写一个Bash脚本,接收单个参数("prod"或"staging"),以此设置全局环境变量,实现切换预演(staging)和生产(prod)环境的AWS密钥。但脚本内日志显示正常,运行脚本后在终端执行echo $AWS_ACCESS_KEY却看不到变量更新。我尝试加了source ~/.zshrc但觉得没必要,请问怎么修改才能让$AWS_ACCESS_KEY全局生效?

附上的脚本代码:

#!/bin/bash

tmpAccess="access"
tmpSecret="secret"

if [ $1 == "prod" ];
then
    echo "Setting the AWS KEYS to $1 keys"
    tmpAccess=$PROD_ACCESS_KEY
    tmpSecret=$PROD_SECRET_KEY

elif [ $1 == "staging" ];
then
    echo "Setting the AWS KEYS to $1 keys"
    tmpAccess=$STAGING_ACCESS_KEY
    tmpSecret=$STAGING_SECRET_KEY
else
    echo "Unknown env passed in: $1"
fi

export AWS_ACCESS_KEY=$tmpAccess
export AWS_SECRETS_KEY=$tmpSecret
echo "Updated AWS_ACCESS_KEY: $AWS_ACCESS_KEY"
echo "Current tmpAccess: $tmpAccess"


echo "AWS_ACCESS_KEY has been updated to $AWS_ACCESS_KEY for env $1"
echo "AWS_SECRETS_KEY has been updated to $AWS_SECRETS_KEY for env $1"

source ~/.zshrc

我的.zshrc文件内容:

export STAGING_ACCESS_KEY=1234
export STAGING_SECRETS_KEY=abcd
export PROD_ACCESS_KEY=5678
export PROD_SECRETS_KEY=efgh
解决方案

核心问题:直接运行脚本会在子shell中执行,子shell内的环境变量无法传递给父终端shell,所以终端里看不到更新。要让变量生效,必须让脚本在当前shell环境中执行,同时修正脚本里的变量名错误。

具体修改步骤:

  1. 移除脚本末尾的source ~/.zshrc——这行代码会重新加载配置文件,直接覆盖你刚设置的变量,完全多余。
  2. 必须用source或.命令加载脚本,而不是直接运行:
    source ./你的脚本名.sh prod
    # 或者用简写形式
    . ./你的脚本名.sh staging
    
  3. 修正脚本里的变量名:你.zshrc里的密钥变量是STAGING_SECRETS_KEY(复数SECRETS),但脚本里写的是STAGING_SECRET_KEY(单数SECRET),这会导致变量取值为空,必须统一变量名。

修改后的最终脚本:

#!/bin/bash

tmpAccess="access"
tmpSecret="secret"

# 给$1加引号,避免参数为空时触发语法错误
if [ "$1" == "prod" ];
then
    echo "Setting the AWS KEYS to $1 keys"
    tmpAccess=$PROD_ACCESS_KEY
    tmpSecret=$PROD_SECRETS_KEY  # 修正为复数SECRETS

elif [ "$1" == "staging" ];
then
    echo "Setting the AWS KEYS to $1 keys"
    tmpAccess=$STAGING_ACCESS_KEY
    tmpSecret=$STAGING_SECRETS_KEY  # 修正为复数SECRETS
else
    echo "Unknown env passed in: $1"
    exit 1  # 可选:遇到错误参数直接退出脚本
fi

export AWS_ACCESS_KEY=$tmpAccess
export AWS_SECRETS_KEY=$tmpSecret
echo "AWS_ACCESS_KEY has been updated to $AWS_ACCESS_KEY for env $1"
echo "AWS_SECRETS_KEY has been updated to $AWS_SECRETS_KEY for env $1"

内容的提问来源于stack exchange,提问作者johnny_mac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 11:10:53