java System.getenv 以“=”开头的环境名称
java System.getenv environment names starting with "="
我注意到 Java 在 Windows 中的环境(通过 System.getenv() 调用获得)包括一些在真实环境中不存在的变量.这些以和等号开头并包括“=ExitCode”,它映射到 运行 就在此 java 调用之前的进程的退出代码;以及各种盘符的默认目录,如“=C:”、“=D:”。这似乎是 Sun 的所有 Java 版本的情况,运行ning 是所有 Windows 版本的情况。这在任何地方都有记录,还是仅供 Sun 内部使用?
编辑
这是一个简单的示例应用程序来说明我的意思。在命令行上编译并运行:
import java.util.Map;
class ShowEnv {
public static void main(String[] args) {
for (Map.Entry v : System.getenv().entrySet())
System.out.printf("%-23s= %.54s%n", v.getKey(), v.getValue());
}
}
然后将变量与SET命令(来自cmd.exe)或类似的用C编写的命令行程序进行比较。你会发现那些以=开头的变量不存在:
=ExitCode = 00000000
=:: = ::\
=C: = C:\Temp
这些变量显然是在JVM执行过程中添加的。
Java 的 System.getenv() 显示了 Java 看到的环境变量。
如果它与 "real" 环境不同,那么您 运行 您的 Java 和 "real" 环境就不同了。
首先,"real" 对您来说是什么?是cmd window吗?然后启动 cmd 需要一些步骤(例如非常过时但仍然有效 autoexec.bat)然后你就有了你的变量。如果 "real" 对您意味着开始->计算机->属性->高级系统设置->环境变量,那么您仍然必须意识到这个特定进程如何启动以及它如何获取变量的流程。至少您可以看到系统变量和用户变量,并了解这不是一个简单的过程。就个人而言,我更喜欢 cmd 方式,因为在这里我使用命令 SET 并在当前时刻查看当前进程的实际变量。当前时刻是另一个因素,因为变量可以根据某些操作随时间变化,也取决于进程何时开始,并且它们会保留在此进程中直到它结束。
这个小讲座的目的是表明 Java 过程很复杂并且取决于许多因素,因此它与 "real" 对您来说是不同的。根据您提供的值,我猜它们可能是您 运行 Java 处理过程中留下的一些人工产物。例如,您的 运行 您在 Eclipse 中的应用程序,它有自己的环境设置,而且每个进程也有自己的设置。一些变量可能来自 Java 中使用的其他变量。 _JAVA_OPTIONS 将是一个很好的例子。
底线 - 如果您的环境不同 - 找到它们但不要责怪 Java 提供它们。您正在管理您的环境,而不是 Java。
以等号开头的系统变量是实数。您观察到的不是 Java 添加 更多环境变量;它是SET
命令隐藏一些变量。
Windows禁止在用户可以设置的环境变量名称中使用等号,从而保留其中带有=
的变量供内部使用。这些变量 can be retrieved through windows APIs,例如GetEnvironmentStringsW
。 Java 库不会过滤此列表,因此您的代码可以使用特殊变量。另一方面,Windows 的 SET
命令将它们过滤掉,造成差异。
根据 this answer,这些 "magic" 变量用于向后兼容 ms-dos 目录处理,因此您可以安全地忽略它们。
我注意到 Java 在 Windows 中的环境(通过 System.getenv() 调用获得)包括一些在真实环境中不存在的变量.这些以和等号开头并包括“=ExitCode”,它映射到 运行 就在此 java 调用之前的进程的退出代码;以及各种盘符的默认目录,如“=C:”、“=D:”。这似乎是 Sun 的所有 Java 版本的情况,运行ning 是所有 Windows 版本的情况。这在任何地方都有记录,还是仅供 Sun 内部使用?
编辑 这是一个简单的示例应用程序来说明我的意思。在命令行上编译并运行:
import java.util.Map;
class ShowEnv {
public static void main(String[] args) {
for (Map.Entry v : System.getenv().entrySet())
System.out.printf("%-23s= %.54s%n", v.getKey(), v.getValue());
}
}
然后将变量与SET命令(来自cmd.exe)或类似的用C编写的命令行程序进行比较。你会发现那些以=开头的变量不存在:
=ExitCode = 00000000 =:: = ::\ =C: = C:\Temp
这些变量显然是在JVM执行过程中添加的。
Java 的 System.getenv() 显示了 Java 看到的环境变量。 如果它与 "real" 环境不同,那么您 运行 您的 Java 和 "real" 环境就不同了。
首先,"real" 对您来说是什么?是cmd window吗?然后启动 cmd 需要一些步骤(例如非常过时但仍然有效 autoexec.bat)然后你就有了你的变量。如果 "real" 对您意味着开始->计算机->属性->高级系统设置->环境变量,那么您仍然必须意识到这个特定进程如何启动以及它如何获取变量的流程。至少您可以看到系统变量和用户变量,并了解这不是一个简单的过程。就个人而言,我更喜欢 cmd 方式,因为在这里我使用命令 SET 并在当前时刻查看当前进程的实际变量。当前时刻是另一个因素,因为变量可以根据某些操作随时间变化,也取决于进程何时开始,并且它们会保留在此进程中直到它结束。
这个小讲座的目的是表明 Java 过程很复杂并且取决于许多因素,因此它与 "real" 对您来说是不同的。根据您提供的值,我猜它们可能是您 运行 Java 处理过程中留下的一些人工产物。例如,您的 运行 您在 Eclipse 中的应用程序,它有自己的环境设置,而且每个进程也有自己的设置。一些变量可能来自 Java 中使用的其他变量。 _JAVA_OPTIONS 将是一个很好的例子。
底线 - 如果您的环境不同 - 找到它们但不要责怪 Java 提供它们。您正在管理您的环境,而不是 Java。
以等号开头的系统变量是实数。您观察到的不是 Java 添加 更多环境变量;它是SET
命令隐藏一些变量。
Windows禁止在用户可以设置的环境变量名称中使用等号,从而保留其中带有=
的变量供内部使用。这些变量 can be retrieved through windows APIs,例如GetEnvironmentStringsW
。 Java 库不会过滤此列表,因此您的代码可以使用特殊变量。另一方面,Windows 的 SET
命令将它们过滤掉,造成差异。
根据 this answer,这些 "magic" 变量用于向后兼容 ms-dos 目录处理,因此您可以安全地忽略它们。