在 Linux 中,环境变量的存储和加载涉及多个配置文件,具体取决于不同的 Shell(如 Bash、Zsh 等)和场景(登录/非登录 Shell、交互式/非交互式 Shell)。以下是常见的存储位置和用法:
1. 用户级配置文件(针对 Bash Shell)
-
~/.bashrc
- 作用 :每次打开新的 非登录交互式 Bash Shell 时加载(如终端窗口)。
- 典型用途 :设置别名、函数、临时环境变量(如
PATH
追加)。 - 注意:仅对当前用户生效。
-
~/.bash_profile 或 ~/.profile
-
作用 :用户登录时(如通过 SSH 或图形界面登录)加载,适用于 登录 Shell。
-
典型用途 :设置登录时需要的环境变量(如
JAVA_HOME
)。 -
区别:
- 如果存在
~/.bash_profile
,Bash 会优先执行它,否则回退到~/.profile
。 - 通常会在
~/.bash_profile
中显式调用~/.bashrc
(例如添加source ~/.bashrc
)。
- 如果存在
-
-
~/.bash_logout
- 作用:用户退出登录 Shell 时执行,用于清理操作(如清空历史记录)。
2. 全局配置文件(系统级)
-
/etc/profile
- 作用:所有用户登录时加载的系统级配置。
- 典型用途 :设置全局环境变量(如
PATH
)、启动系统级程序(如umask
设置)。
-
/etc/bash.bashrc
- 作用:所有用户的非登录交互式 Bash Shell 加载。
- 典型用途:定义全局别名或函数(需注意权限风险)。
-
/etc/environment
- 作用 :系统级环境变量文件,由
pam_env
模块读取(不依赖 Shell)。 - 典型用途 :设置全局
PATH
或静态变量(格式为KEY=value
,不支持脚本)。
- 作用 :系统级环境变量文件,由
3. Shell 类型的影响
- 登录 Shell(Login Shell) :
通过登录(如 SSH、su -l
)启动,会加载~/.profile
、~/.bash_profile
、/etc/profile
。 - 非登录 Shell(Non-Login Shell) :
直接启动的终端(如桌面环境的终端),仅加载~/.bashrc
和/etc/bash.bashrc
。 - 交互式 Shell(Interactive Shell) :
用户可交互操作的 Shell,会加载rc
文件(如~/.bashrc
)。 - 非交互式 Shell(Non-Interactive Shell) :
执行脚本时启动的 Shell,仅加载BASH_ENV
指定的文件(默认不加载任何配置)。
4. 其他 Shell 的配置文件
-
Zsh:
~/.zshrc
(类似~/.bashrc
)~/.zprofile
(类似~/.bash_profile
)
-
Fish:
~/.config/fish/config.fish
5. 动态管理环境变量的方法
-
临时变量:
bashexport TEMP_VAR="value" # 仅在当前 Shell 生效
-
持久化变量 :
将
export VAR="value"
写入~/.bashrc
或~/.profile
并执行source
重新加载。 -
针对特定会话 :
使用
~/.pam_environment
(需谨慎,部分系统已弃用)。
6. 优先级总结
- 用户登录时:
/etc/profile
→~/.bash_profile
/~/.profile
→~/.bashrc
(如果被显式调用)。 - 非登录 Shell:
/etc/bash.bashrc
→~/.bashrc
。 - 脚本执行时:默认不加载任何配置,除非通过
BASH_ENV
指定。
最佳实践建议
- 用户自定义变量 :优先放在
~/.bashrc
(终端友好)或~/.profile
(登录需要)。 - 系统级变量 :使用
/etc/environment
或/etc/profile.d/
下的独立脚本。 - 调试加载顺序 :通过
echo
或set -x
观察文件加载过程。
通过合理选择配置文件,可以灵活控制环境变量的作用范围和生命周期。