![将所有环境变量存储在一个文件中](https://linux22.com/image/137112/%E5%B0%86%E6%89%80%E6%9C%89%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E5%AD%98%E5%82%A8%E5%9C%A8%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD.png)
使用带有环境变量的单个文件有哪些注意事项?
我想要做的是创建一个文件(例如~/.env
),其中包含所有必要的PATH
声明和可能的其他非机密环境变量,例如EDITOR
和GOPATH
,并让该文件源自每个特定于 shell 的点文件。
具体来说,我想包括这一行
. "$HOME/.env"
致所有.profile
,,,,,,.bash_profile
.bashrc
.zprofile
.zshenv
.zshrc
目标是在交互式/非交互式和登录/非登录 shell 中执行的命令具有一致的行为。
为什么我不想这样做?是否会因此而出现一些问题?
我在 SE 上阅读了很多与该主题相关的答案,例如
https://superuser.com/a/187673/924981
https://askubuntu.com/a/540689
https://askubuntu.com/a/866240
https://stackoverflow.com/q/14637979/3885799
我了解 env 声明的一些建议做法。但是,我想知道上述方法是否也可以接受且安全。
答案1
唯一的问题是,如果您从 和 获取文件.bash_profile
,.bashrc
并且这两个文件互相获取文件(对于其他 shell 也是如此),那么您在启动 shell 会话时可能会多次(两次)获取环境文件。
这不是问题,除非你附加/前置环境变量的值。
env_sourced
您可以通过设置 shell 变量(例如文件中的某个值)然后在顶部测试它来防止这种情况:
# My environment file
[ -n "$env_sourced" ] && return
env_sourced=1
PATH="$PATH:/some/path"
# etc.
答案2
我不明白你为什么不应该这样做。例如,我在混合 bash/zsh 环境中工作(即我在一些终端窗口中使用 bash,在一些 zsh 中使用)。我将这些定义(环境变量、非导出变量、shell 函数)放在一个公共文件中,这些定义在语法上与两种语言兼容,该文件是从 .bashrc 和 .zshrc 获取的。