为什么';java-version';去斯特德?

为什么';java-version';去斯特德?,java,stdout,stderr,Java,Stdout,Stderr,java-version转到stderr的结果有什么特殊原因吗 例如,此命令从Windows的提示行执行: java -version > java_version.txt 将文件java_version.txt保留为空 编辑:在不带任何参数的情况下执行java.exe后打印出的帮助也会发生同样的情况 编辑:纯粹出于好奇,我检查了它是否一直都是这样,结果证明它确实是这样java-version在JDK 1.1.8和JDK 1.2.2中转到stderr,但是没有任何参数的java.exe的

java-version
转到
stderr
的结果有什么特殊原因吗

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

java -version > java_version.txt
将文件
java_version.txt
保留为空

编辑:在不带任何参数的情况下执行
java.exe
后打印出的帮助也会发生同样的情况


编辑:纯粹出于好奇,我检查了它是否一直都是这样,结果证明它确实是这样
java-version
在JDK 1.1.8和JDK 1.2.2中转到
stderr
,但是没有任何参数的
java.exe
的输出则不会。此问题的解决方法是:

java -version 2> java_version.txt
java版本的结果转到stderr有什么特殊原因吗

好吧,没有什么特别的原因。这就是
java
命令的实现方式。可能要追溯到Java1.0,尽管要验证这一点非常困难

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

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


你能/应该做什么

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

1-这里有证据表明这是多么不可能。请注意“解决方案:不会修复”。。。最后的评论。

谢谢你的回答。这是有帮助的,但是没有回答我的问题。我想知道这种设计背后是否有什么特殊原因。这几乎是*NIX命令的标准。遗憾的是,
javac-version
这样做也很奇怪。解决方法:
java-version 2>&1 | egrep'java | version'--color