在 CentOS 里经常有人遇到「env 设置了但没生效」的问题,通常并不是 env 命令本身有问题,而是使用方式或作用范围不对。下面按常见原因逐一说明。
env 只是“临时给某条命令设环境”env FOO=bar ./myscript.sh
✅ 这样 只对这条命令生效
❌ 不会影响到当前 shell 或之后的命令
如果你执行完又跑:
echo $FOO
是空的,这是正常的。
错误示例:
env PATH=/usr/local/bin
这只会打印环境变量,不会修改当前 shell 的 PATH。
✅ 正确做法:
export PATH=/usr/local/bin:$PATH
或
PATH=/usr/local/bin:$PATH
export PATH
bash script.sh 执行# test.sh
export TEST=123
bash test.sh
echo $TEST # 空
原因:
脚本在子 shell 中运行,变量不会影响父 shell。
✅ 正确方式:
source test.sh
# 或
. test.sh
.bashrc / .profile 但没重新登录或 source例如:
export JAVA_HOME=/opt/java
但你:
source ~/.bashrc解决:
source ~/.bashrc
或根据 shell 类型:
~/.bash_profile~/.bashrc| 场景 | 文件 |
|---|---|
| 登录 shell | ~/.bash_profile |
| 非登录 shell | ~/.bashrc |
| 系统级 | /etc/profile /etc/profile.d/*.sh |
⚠️ 写在 ~/.bashrc 里的变量,cron / systemd 不会自动加载
错误:
export MY_ENV=1
systemctl start myapp
✅ 正确方式:
# /etc/systemd/system/myapp.service
[Service]
Environment=MY_ENV=1
然后:
systemctl daemon-reload
.env)FOO = bar
❌ 等号两边有空格
✅ 正确:
FOO=bar
并且需要手动加载:
set -a
source .env
set +a
export?source 了配置文件?如果你能贴出具体命令或场景(比如:脚本 / systemd / docker / cron),我可以直接告诉你哪一步错了。