用 env 可查看当前 shell 已导出的环境变量,按字母序排列;echo $VAR_NAME 易因拼错或未 export 导致误判,printenv 更可靠;set 显示所有 shell 变量(含未导出项),env 仅显示导出项;不同登录方式加载 ~/.bash_profile、~/.profile 或 ~/.bashrc 不同,需注意 source 和 export 是否执行。

直接看当前 shell 的所有环境变量用 env
终端里敲 env 就能列出当前 shell 进程里全部生效的环境变量,按字母顺序排好,干净利落。它只显示「导出过」的变量(即被 export 设置过的),不显示普通 shell 变量。
常见误操作是改了 ~/.bashrc 但没运行 source ~/.bashrc,这时候 env 里自然看不到新变量——别急着怀疑语法,先确认是否已重载配置。
查某个特定变量值用 echo $VAR_NAME 或 printenv VAR_NAME
echo $PATH 最常用,但要注意:如果变量名拼错、或根本没 export,它会静默输出空行,容易误判为“值为空”。printenv PATH 更可靠——变量不存在时直接无输出,不会混淆;而且它不触发 shell 展开,对含空格或特殊字符的值更安全。
这两个命令行为差异点:
• echo $HOME 依赖当前 shell 解析,可能受引号/转义影响
• printenv HOME 是独立命令,只查环境块,更接近真实传递给子进程的值
区分「shell 变量」和「环境变量」:用 set 和 env 对比看
set 列出所有 shell 变量(含函数、未导出变量),数量远多于 env;env 只列导出项。两者差集,就是你定义了但没 export 的变量。
典型踩坑场景:
• 在脚本里写 MY_VAR="abc"; echo $MY_VAR 能打印,但子命令(如 python -c "import os; print(os.environ.get('MY_VAR'))")拿不到
• 原因就是漏了 export MY_VAR
验证方法:set | grep '^MY_VAR=' 有输出,但 env | grep '^MY_VAR=' 没输出 → 就是没导出
开机/登录时哪些文件会影响环境变量
不同登录方式加载的配置文件不同,直接影响 env 结果:
• SSH 登录或终端模拟器新开 tab:通常走 ~/.bash_profile 或 ~/.profile(bash 非交互登录 shell)
• GNOME/KDE 图形界面启动的终端:常只读 ~/.bashrc(非登录 shell)
• Docker 容器默认是非登录 shell,只认 ~/.bashrc 或 /etc/environment
关键点:~/.bashrc 一般不自动被登录 shell 执行,除非你在 ~/.bash_profile 里显式写了 source ~/.bashrc ——很多人卡在这步,以为改了 .bashrc 就全局生效
环境变量不是写完就落地,得看谁启动了 shell、走哪条加载路径、有没有真正 export。图形界面下新开终端、SSH 登录、systemd 服务、crontab 任务……每个上下文的环境来源都可能不同,别假设它们一致。










