在 Debian 上“env 问题”通常指环境变量(environment variables)不生效、错乱、被覆盖、SSH / systemd / cron 下不一致等。下面按常见场景 + 调试方法 + 解决思路来说明。
env
printenv
echo $PATH
echo $MY_VAR
echo $0
ps -p $$
bash / sh / zsh 加载文件不同/bin/sh 是 dash(不是 bash)加载顺序:
/etc/profile
/etc/profile.d/*.sh
~/.bash_profile
~/.bash_login
~/.profile
/etc/bash.bashrc
~/.bashrc
#!/bin/bash
不会加载上述任何文件
原因:脚本是非交互 shell
✅ 调试:
bash -x your_script.sh
✅ 解决:
sourcesource ~/.bashrc
env 启动env VAR=value ./script.sh
原因:
PermitUserEnvironment nobashrc 被跳过✅ 调试:
ssh user@host 'env'
✅ 解决:
~/.profile 或 ~/.bash_profile 设置变量~/.bashrc 放 PATH(登录 shell 不读)systemd 不会读 bashrc / profile
✅ 查看服务环境:
systemctl show your-service | grep Environment
✅ 设置方式:
[Service]
Environment=MY_VAR=value
EnvironmentFile=/etc/default/myapp
或:
systemctl edit myapp
cron 的 PATH 默认只有:
/usr/bin:/bin
✅ 调试:
* * * * * env > /tmp/cron_env
✅ 解决:
PATH=/usr/local/bin:/usr/bin:/bin
MY_VAR=value
sudo 默认重置环境
✅ 调试:
sudo env
✅ 解决:
sudo -E command
或修改:
visudo
Defaults env_keep += "MY_VAR"
echo "from $0"
grep -R "MY_VAR" /etc /home/$USER
export | grep MY_VAR
✅ 系统级变量
/etc/environment
/etc/profile.d/myapp.sh
✅ 服务变量
/etc/default/myapp
✅ 用户变量
~/.profile(登录)
~/.bashrc(交互)
你可以直接说:
我可以给你精确到文件级的修复方案。