在 CentOS(以及大多数 Linux 发行版)里,env 本身并不是“不继承变量”,而是你看到的现象通常由以下几种情况导致。下面按常见原因解释。
env 只是显示/传递环境变量,不读取 shell 配置文件env 的作用是:
env)env -i command)⚠️ 关键点:
env不会自动 source 你的~/.bashrc、/etc/profile等文件
所以如果你在脚本或子 shell 里用 env,而变量只在 .bashrc 中定义,且不是 export 的,那就看不到。
# ~/.bashrc
MYVAR=hello
env | grep MYVAR
# 空(因为没 export)
✅ 正确方式:
export MYVAR=hello
export,只是 shell 变量这是最常见原因。
VAR=123 # shell 变量
env | grep VAR # 看不到
export VAR=123 # 环境变量
env | grep VAR # 能看到
✅ 只有 export 的变量才会被子进程(包括 env)继承
env -i 会清空环境env -i bash
env
此时环境是完全空的,当然“不继承变量”。
✅ 如果你想要继承:
env bash
cron 的环境非常干净:
.bashrc* * * * * env > /tmp/env.log
你会发现很多变量都没有。
[Service]
Environment=...
不会继承用户 shell 变量。
su
默认不加载目标用户环境(取决于 PAM)。
✅ 推荐:
su - # 登录 shell,加载环境
CentOS 中:
/etc/profile, ~/.bash_profile~/.bashrc所以:
bash -c 'env'
可能比你在终端里少很多变量。
如果你发现 env 没变量,请检查:
export 了?.bashrc 而非 .bash_profile?env -i?CentOS 的
env会继承环境变量,但不会继承“未 export 的 shell 变量”,也不会自动加载 shell 配置文件。
如果你愿意,可以把你具体的命令和场景(比如脚本 / cron / docker / systemd)发出来,我可以精准指出是哪一种原因。