环境变量名必须全大写,小写或混合大小写(如java_home、Java_Home)会导致工具链完全无法识别;Windows下CMD显示不区分大小写属巧合,Linux/macOS shell严格区分,echo $java_home必为空。

环境变量配置时大小写写错,不是“看起来差不多”的小问题,而是直接导致变量不被识别、工具链断裂的硬性失败点。排查核心就一条:变量名必须严格匹配系统和程序约定的大写形式,不能靠猜测或类比。
确认变量名是否全大写且拼写准确
绝大多数主流环境变量(如JAVA_HOME、PATH、APP_DEBUG)在所有操作系统中都要求变量名全大写。写成java_home、Path、app_debug均无效。
- Windows:用
set JAVA_HOME查看是否输出值;若set java_home也返回内容,那是巧合(CMD不区分大小写显示),但程序不会读它 - Linux/macOS:用
echo $JAVA_HOME验证;echo $java_home一定为空,因为shell严格区分大小写 - C#中
Environment.GetEnvironmentVariable("PATH")返回null,很可能是传了"path"小写参数
检查配置位置与生效范围是否一致
大小写错误常和作用域混在一起被误判。比如你在系统级设了JAVA_HOME,却在IDE调试配置里手动填了java_home,那IDE根本不会继承系统变量。
- 终端中运行
echo $JAVA_HOME有值,但IDE里报错 → 检查IDE是否使用独立环境配置(如IntelliJ的“Run Configuration → Environment variables”) - PowerShell里
$env:JAVA_HOME有值,CMD里%JAVA_HOME%为空 → 两者环境隔离,需分别设置 - Docker容器内
printenv | grep -i java没结果 → 不是大小写错,而是environment:字段没写对,或env_file:路径不对
验证工具是否真正读取了该变量
别只信echo或set命令输出。要验证实际调用链是否拿到变量:
- Java:运行
$JAVA_HOME/bin/java -version,而非仅java -version(后者可能来自PATH中其他JDK) - ThinkPHP:在
public/index.php顶部加var_dump($_ENV); exit;,看数组里有没有你定义的键(注意APP_DEBUG=true才加载.env) - Go(viper):
viper.Get("APP_DEBUG")返回nil?先确认viper.AutomaticEnv()已启用,且环境变量名是APP_DEBUG而非app_debug
留意路径中大小写与系统差异
变量名大小写是通用规则,但路径部分在不同系统表现不同:
- Windows文件路径不区分大小写,
C:\Program Files\Java\JDK-17和c:\program files\java\jdk-17都能用 - Linux/macOS路径严格区分大小写,
/usr/lib/jvm/java-17-openjdk-amd64写成AMD64就找不到 - Docker挂载时若宿主机是macOS,卷路径大小写敏感;Linux宿主机则取决于文件系统(ext4区分,xfs默认区分)











