“为什么?”;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。。。