在 CentOS(以及所有 Linux 系统)中,环境变量(env)本身就是从父进程继承给子进程的,这是操作系统的默认行为。你通常不需要“额外配置”去让它继承,反而需要显式避免继承或显式传递。
下面分几种常见情况说明:
例如:
# 父进程(当前 shell)
export MY_VAR=hello
echo $MY_VAR
# 启动子进程(bash、脚本、程序)
bash -c 'echo $MY_VAR'
输出:
hello
✅ 只要用 export 设置,子进程就会继承
#!/bin/bash
echo $MY_VAR
执行:
export MY_VAR=centos
./test.sh
✅ 脚本会继承当前 shell 的环境变量
systemd 服务中继承(⚠️ 重点)systemd 服务默认不会继承 shell 的环境变量
[Service]
Environment=MY_VAR=centos
ExecStart=/opt/app/start.sh
[Service]
EnvironmentFile=/etc/sysconfig/myapp
ExecStart=/opt/app/start.sh
/etc/sysconfig/myapp:
MY_VAR=centos
PassEnvironment(仅对 user service 或某些情况有效)[Service]
PassEnvironment=MY_VAR
extern char **environ;
import os
print(os.environ["MY_VAR"])
✅ 自动继承父进程 env
env -i bash
或
env -i ./app
❌ 子进程不会继承任何环境变量
| 写法 | 是否继承 |
|---|---|
VAR=123 ./app |
✅ 仅对该命令生效 |
VAR=123 |
❌ 不 export,不继承 |
export VAR=123 |
✅ 全局继承 |
systemd 启动 |
❌ 默认不继承 shell env |
CentOS 中环境变量默认就会从父进程继承,关键是:用
export设置,并确保不是被 systemd / env -i 等环境隔离机制阻断。
如果你有具体场景(比如:cron、systemd、docker、sudo、某个程序不读 env),可以告诉我,我可以给你精确方案。