# 使用
有时为了保护一些隐私数据,会将其值或路径等设置到环境变量中,在程序里也通过环境变量获取。比如证书路径、密码密钥等信息。这样同时也可以避免某些代码提交到 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 。