# 使用

有时为了保护一些隐私数据,会将其值或路径等设置到环境变量中,在程序里也通过环境变量获取。比如证书路径、密码密钥等信息。这样同时也可以避免某些代码提交到 Git 导致的信息暴露。

Go 提供了方便的方法来读写环境变量。

// 设置
_ = os.Setenv("KEY_PATH", "/usr/local/key")
// 获取
keyPath := os.Getenv("KEY_PATH")
// 判断有没有值
keyPath, ok := os.LookupEnv("KEY_PATH")

使用 LookupEnv 可以判断是否存在该值。

# 无法获取

但在这里遇到过一个问题,在系统中设置的环境变量无法在程序当中获取到。比如设置在 /etc/profile~/bash_profile 等文件中时,无法获取到。

原因在于 shell 中设置的环境变量为局部变量。通过该 shell 启动的子进程无法获取到局部变量,因此需要使用 export 导出变量为全局变量才能访问到。

export KEY_PATH="/usr/local/key"

# shell 环境变量的关系

通过 export 导出的环境变量,在当前 shell 及其创建的子进程中都可见。但对于子进程来说相当于拷贝了一份父 shell 的环境变量。因此在子进程中修改该环境变量不会影响父 shell 中的变量,即使是 export 导出也不行

环境变量
export KEY_PATH="/usr/local/key"
echo $KEY_PATH
/usr/local/key
bash
echo $KEY_PATH
/usr/local/key
export KEY_PATH="/my/path"
echo $KEY_PATH
/my/path
exit
exit
echo $KEY_PATH
/usr/local/key

在子 shell 中重新导出了该变量,但退出后父 shell 的值不受影响。

因此,在 Go 程序中也一样,通过 os.Setenv 设置的环境变量,仅在该程序运行期间有效,当程序退出后,它设置的环境变量就无效了,不会改变启动它的 shell 的环境变量,更不会影响系统的环境变量。

最后 shell 中要删除环境变量使用 unset 命令

unset KEY_PATH

如同设置修改一样,删除也不影响父 shell 。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

HuaLin 微信支付

微信支付

HuaLin 支付宝

支付宝