为什么'java -version'会转到stderr?

Jag*_*ger 14 java stdout stderr

是否有结果什么特别的理由java -versionstderr

例如,此命令从Windows的提示行执行:

java -version > java_version.txt
Run Code Online (Sandbox Code Playgroud)

将文件java_version.txt留空.

编辑:执行后java.exe没有任何参数打印出的帮助也是如此.

编辑:出于纯粹的好奇心,我检查了它是否总是那样,事实证明它确实存在.java -version转到stderrJDK 1.1.8和JDK 1.2.2,但是java.exe没有任何参数的输出没有.

Ste*_*n C 18

java -version的结果是否有特殊原因要求stderr?

AFAIK,没有特殊原因.这就是java命令的实现方式.可能一直回到Java 1.0,尽管验证它是非常困难的.

我的简短调查表明,这种行为与大多数Linux命令的行为方式不一致 ......我尝试过的其他一切都使用stdout来获取版本信息.(毕竟,版本信息不是"错误"输出.)

但请注意--version/ -version选项是一种约定,而不是任何正式标准所要求的.(GNU编码标准声明命令应该实现--version,并且版本信息应该写入标准输出.但POSIX标准没有提到这一点,LSB标准也没有.)


你能做什么/应该做什么?

  • 在shell脚本或批处理文件中捕获stderr而不是stdout应该很容易.
  • 这样做应该没有任何风险.Oracle无法更改Java工具链以将-version输出发送到stdout而不会破坏客户脚本.这非常不可能1.

1 - 以下证据表明它不太可能:http://bugs.sun.com/bugdatabase/view_bug.do?video_id = 4380614.请注意"决议:不修复"......以及最终评论.