为什么"java -version"将其输出打印到错误流?

Ksh*_*rma 7 java

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

java -version 2> ~/error.txt
Run Code Online (Sandbox Code Playgroud)

error.txt 填充版本.

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

java -version > ~/output.txt
Run Code Online (Sandbox Code Playgroud)

output.txt 是空的.

为什么java二进制打印正常输出到错误流?

Jef*_*ica 9

根据Java文档:

-showversion

显示版本信息并继续执行应用程序.此选项等同于该  -version选项,但后者指示JVM在显示版本信息后退出.

-版

显示版本信息,然后退出.此选项等同于该  -showversion 选项,除了后者在显示版本信息后不指示JVM退出.

现在考虑维基百科对stderr的定义:

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

大多数以POSIX为中心的工具都为其stdout流规定了非常仔细的规范,因此工具的输出可以在其他地方输出.Stderr的规定要少得多,并且可以自由地用于记录和错误.

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

对于它的价值,将请求的元数据打印到stderr vs stdout是一个悬而未决的问题,因此除了每个应用程序记录的行为之外,"标准实践"几乎没有.

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

VERSION=$(java -version 2>&1)
Run Code Online (Sandbox Code Playgroud)

  • 在 OpenJdk 11.0.1 上有 4 个选项:`-version`、`--version`、`-showversion` 和 `--showversion`。`version` 和 `showversion` 都具有相同的效果,但只有一个破折号输出为错误,两个破折号都正常输出并且可以存储到变量中。如果您出于某种原因想要获得错误输出并将其存储到变量中,您可以这样做:> Invoke-Expression "java -version" -ErrorVariable javaVaraible java : openjdk version "11.0.1" 2018-10-16 。 .. > $javaVaraible java:openjdk 版本“11.0.1” 2018-10-16 ... (2认同)