在 CentOS(以及所有 Linux) 中,子进程默认就会继承父进程的环境变量,这是操作系统的行为,不是 CentOS 特有的。下面分几种常见情况说明。
子进程会自动继承父进程的 environment(环境变量)
例如:
# 父进程
export VAR1=hello
bash # 启动子进程
# 子进程中
echo $VAR1
# 输出 hello
✅ 原因:
export 会把变量放进 environment,子进程 fork 时会继承。
export 导出的变量env / printenv 能看到的环境变量export PATH=/usr/local/bin:$PATH
VAR2=world # 不会继承
bash
echo $VAR2 # 空
bash
sh
su
sudo
✅ 继承父 shell 的环境变量
⚠️ 但 su / sudo 可能会重置环境(见下文)
export MYVAR=123
systemctl start my.service
MYVAR 在 service 里是空的。
✅ 正确方式:
# /etc/systemd/system/my.service
[Service]
Environment="MYVAR=123"
# 或
EnvironmentFile=/etc/sysconfig/my
默认 sudo 会清理环境变量
-Esudo -E env
/etc/sudoersDefaults env_keep += "VAR1 VAR2"
cron 任务 不会继承 shell 环境变量
✅ 在 crontab 中声明:
VAR1=123
* * * * * /path/script.sh
或:
source /home/user/.bash_profile
export TEST_VAR=centos
echo $TEST_VAR
或:
ps e -p $$
| 现象 | 原因 |
|---|---|
| export 了但还是没有 | 子进程是 systemd / cron / sudo |
| su 后变量没了 | su 默认不保留 |
| ssh 后变量没了 | ssh 不会传未导出的变量 |
CentOS 中子进程自动继承父进程的环境变量,前提是你用的是
export,并且父进程没有被环境重置(如 systemd、sudo、cron)。
如果你有具体场景(比如 systemd / sudo / Jenkins / Docker / SSH),可以贴出来,我可以给你精确的配置方案。