/etc/environment仅支持KEY="value"纯文本格式,不执行shell语法,专用于PAM登录时加载静态变量;非登录Shell完全不读取,生效需重新登录,错误配置会导致PATH丢失甚至无法登录。

/etc/environment 是 Linux 系统中一个特殊但容易被误用的环境变量配置文件。它不执行任何 shell 代码,只接受最简形式的键值对,比如 JAVA_HOME="/usr/lib/jvm/java-17" 或 LANG="zh_CN.UTF-8"。写错格式(如加 export、用 $PATH 展开、含未转义空格)会导致整个文件加载失败——PATH 可能丢失,连 ls 都找不到,甚至图形界面登录卡死。
/etc/environment 的真实作用范围
它由 PAM 模块 pam_env.so 在用户登录认证阶段一次性读取,仅影响登录式会话(例如:SSH 登录、TTY 登录、图形界面完整注销后重新登录)。非登录 Shell(如终端新标签页、VS Code 内置终端、bash -c '...'、cron 任务)完全不读这个文件,也不会自动继承其中变量——这不是配置遗漏,而是设计如此。
什么时候该用 /etc/environment
- 设置与 shell 无关、需被所有进程(包括 systemd 服务、守护进程、GUI 应用)统一继承的静态变量,例如:LANG、LC_ALL、HOME
- 需要绕过 shell 解析、确保变量以原始字符串形式注入的场景(如某些安全策略要求禁止变量展开)
- 系统级基础变量,且你有能力完整重写 PATH(不能追加),并确认所有默认路径都已包含
常见错误及替代方案
想把 /opt/myapp/bin 加进 PATH?别在 /etc/environment 里写 PATH="$PATH:/opt/myapp/bin"——这会直接失效。更稳妥的做法是:
- 用 /etc/profile.d/myapp.sh(内容:export PATH="/opt/myapp/bin:$PATH"),它支持 shell 语法,且被所有登录 Shell 自动 source
- 若需覆盖非登录 Shell(如 IDE 终端),在 ~/.bashrc 开头添加:set -o allexport; source /etc/environment; set +o allexport(仅 Bash 有效)
- systemd 服务必须显式声明:Environment="JAVA_HOME=/usr/lib/jvm/java-17",不能依赖 /etc/environment
验证是否生效
别在当前终端里 echo 测试——它本来就不该生效。正确方法是:
- 新开一个登录式终端(如 Ctrl+Alt+F2 切 TTY,再登录)
- SSH 断开重连
- 运行 loginctl show-user $USER | grep environment 查看 PAM 实际加载结果


















