Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“为什么?”;java版本;是否将其输出打印到错误流?_Java - Fatal编程技术网

“为什么?”;java版本;是否将其输出打印到错误流?

“为什么?”;java版本;是否将其输出打印到错误流?,java,Java,让我们尝试重定向java的标准错误: java -version 2> ~/error.txt error.txt中填充了版本 让我们尝试重定向标准输出: java -version > ~/output.txt output.txt为空 为什么javabinary将正常输出打印到错误流?似乎是一个错误,或者只是一个不一致性。与UNIX中的许多其他命令相比,java命令将版本输出发送到stdout: VERSION=$(java -version 2>&1) mv

让我们尝试重定向
java
的标准错误:

java -version 2> ~/error.txt
error.txt
中填充了版本

让我们尝试重定向标准输出:

java -version > ~/output.txt
output.txt
为空


为什么
java
binary将正常输出打印到错误流?

似乎是一个错误,或者只是一个不一致性。与UNIX中的许多其他命令相比,java命令将版本输出发送到stdout:

VERSION=$(java -version 2>&1)
mvn-v>~/output.txt#按预期工作

但这已经结束了。Oracle可能无法修复该问题,因为它可能会导致系统出现问题,而这些系统期望Oracle以这种方式运行

根据:

-展示版

显示版本信息并继续执行应用程序。此选项相当于
-version
选项,只是后者指示JVM在显示版本信息后退出

-版本

显示版本信息,然后退出。此选项相当于
-showversion
选项,只是后者在显示版本信息后不会指示JVM退出

现在考虑:

标准错误是程序通常用于输出错误消息或诊断的另一个输出流

大多数以POSIX为中心的工具为其标准输出流规定了非常仔细的规范,因此该工具的输出可以通过管道传输到其他地方。Stderr的规定要少得多,并且可以自由地用于记录日志和错误

使用
-showversion
,Java允许在运行的应用程序附近打印版本信息。但是,如果将版本信息打印到stdout,它将无法与可能伴随它的正常应用程序输出区分开来,迫使您自己扫描并删除该行输出。当然,使用
-version
而不是
-showversion
,版本字符串很可能是预期的输出,但保持一致性本身就是一个不错的目的

因此,除了每个应用程序记录的行为之外,几乎没有“标准实践”方面的内容

要解决此问题,只需将stderr重定向到stdout:

VERSION=$(java -version 2>&1)

大多数编译器都会这样做。@EJP这不是答案。我的后续问题是——为什么?杰夫鲍曼有一个很好的解释,你是对的。这不是答案。这就是我将其作为评论发布的原因。在OpenJdk 11.0.1上有4个选项:
-version
-version
-showversion
-showversion
version
showversion
都有相同的效果,但只有一个破折号输出为错误,两个破折号都输出为正常,可以存储到变量中。如果出于某种原因,您希望获得错误输出并将其存储到变量中,您可以这样做:>调用表达式“java-version”-ErrorVariable javaVaraible java:openjdk version“11.0.1”2018-10-16…>$JavavaraibleJava:openjdk版本“11.0.1”2018-10-16。。。