“Debian 环境下环境变量(env)丢失”是一个比较常见的问题,原因通常跟登录方式、shell 类型、配置文件加载顺序有关。下面按常见原因和排查思路给你梳理一下。
Debian 默认 shell 通常是 bash,而 bash 在不同启动方式下加载的文件不同:
| 启动方式 | 加载文件 |
|---|---|
| 登录 shell(login) | /etc/profile → ~/.bash_profile / ~/.bash_login / ~/.profile |
| 非登录交互 shell | ~/.bashrc |
| 非交互 shell(脚本) | 只看 BASH_ENV |
典型问题:
ssh user@host → 登录 shell,env 正常su user 或 docker exec → 可能不是登录 shell,env 丢失✅ 解决:
su - user # 注意“-”,模拟登录
或把变量写进 ~/.bashrc + ~/.profile
su 没有 -su root
❌ 不会加载 profile
✅ 用:
su - root
sudo env
很多变量(如 PATH、LANG)会被清掉。
✅ 解决:
sudo -E command # 保留 env
或修改 /etc/sudoers:
Defaults env_keep += "PATH LANG MY_VAR"
systemd 服务不会读取 .bashrc / .profile
✅ 正确方式:
[Service]
Environment=MY_VAR=value
或
systemctl import-environment
常见原因:
docker exec 没带 -eENV 但运行时被 shell 覆盖/bin/sh 而不是 login shell✅ 检查:
docker exec -e MY_VAR=1 container env
很多人把变量写在:
~/.bashrc(只在交互 shell 生效)✅ 建议:
/etc/environment~/.profile~/.bashrc# 当前 shell 类型
echo $0
ps -p $$
# 看 env
env
# 哪个文件被加载
bash -x -l -c 'true' 2>&1 | grep profile
你可以告诉我:
cat /etc/os-release)我可以给你具体修复命令,而不是泛泛而谈。