在 CentOS 中,环境变量(env)不生效通常是因为设置的位置或方式不对。下面按常见原因给你系统梳理一下,并给出正确的做法。
不同文件作用范围不同,写错文件 = 不生效
| 文件 | 生效范围 | 说明 |
|---|---|---|
/etc/profile |
所有用户(登录 shell) | 系统级 |
/etc/bashrc |
所有用户(交互 shell) | 系统级 |
~/.bash_profile |
当前用户(登录 shell) | 用户级 |
~/.bashrc |
当前用户(交互 shell) | 用户级 |
/etc/environment |
所有用户 | 不识别变量展开 |
✅ 推荐做法
~/.bash_profile~/.bashrc/etc/profile.d/xxx.sh(最推荐)export(致命错误)❌ 错误写法:
JAVA_HOME=/usr/local/java
✅ 正确写法:
export JAVA_HOME=/usr/local/java
不 export = 只对当前 shell 有效,子进程拿不到
修改完配置文件后,必须执行:
source ~/.bashrc
# 或
. ~/.bash_profile
或直接重新登录:
logout
否则不会生效。
cron 不会读取 bashrc / profile
✅ 解决:
SHELL=/bin/bash
BASH_ENV=/etc/profile.d/env.sh
或在脚本里手动 source:
#!/bin/bash
source /etc/profile
systemd 服务 不会加载用户环境变量
✅ 解决:
[Service]
Environment="JAVA_HOME=/usr/local/java"
或:
EnvironmentFile=/etc/sysconfig/myapp
su 切换用户不生效su root
❌ 不会加载环境变量
✅ 使用:
su - root
CentOS 默认是 bash,但如果你用了:
/bin/zsh
那么:
~/.bashrc ❌ 不生效~/.zshrc ✅ 才生效检查当前 shell:
echo $SHELL
例如:
export PATH=/usr/local/bin
export PATH=/usr/bin
✅ 正确写法:
export PATH=/usr/local/bin:$PATH
vim /etc/profile.d/myenv.sh
内容:
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
权限:
chmod +x /etc/profile.d/myenv.sh
加载:
source /etc/profile
你可以按顺序检查:
echo $JAVA_HOME
env | grep JAVA
bash -c 'echo $JAVA_HOME'
如果:
su 不是 su -你可以直接把下面信息发我,我可以精准定位:
我可以一步一步帮你查 ✅