在 CentOS(以及所有 Linux 系统)里,环境变量(env)本身就是从父进程继承的,这是 shell 和进程模型的基本行为。你的问题可能更偏向“为什么没继承到”或“怎么正确地让子进程继承”。下面分场景说明。
例如:
export VAR=hello
bash # 启动子 shell
echo $VAR # 输出 hello
✅ 子进程 自动继承 父进程的所有 export 变量
exportVAR=hello
bash
echo $VAR # 空
❌ 非 export 变量不会进入环境
✅ 正确方式:
export VAR=hello
env -i 或 cleanenvenv -i bash
这会清空环境,子进程不继承任何变量
systemd 启动的服务systemd 不会继承登录 shell 的环境
systemctl show myservice | grep Environment
systemctl edit myservice
[Service]
Environment=VAR=hello
或:
EnvironmentFile=/etc/sysconfig/myservice
cron 几乎不给环境
* * * * * export VAR=hello; /path/script.sh
或脚本里自己 export
env VAR=$VAR bash
env | grep MY_
MY_VAR=1 my_program
ps e -p <PID>
或:
cat /proc/<PID>/environ | tr '\0' '\n'
| 场景 | 是否继承 |
|---|---|
| 普通 shell 子进程 | ✅ |
| export 变量 | ✅ |
| 非 export 变量 | ❌ |
| systemd 服务 | ❌(需配置) |
| cron | ❌(需手动) |
| env -i | ❌ |
如果你能说清楚具体场景(比如:systemd?cron?docker?shell 脚本?),我可以给你更精确的写法。