为什么'java -version'去stderr?

2022-09-01 21:02:23

去的结果有什么特殊原因吗?java -versionstderr

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

java -version > java_version.txt

将文件留空。java_version.txt

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

编辑:只是出于纯粹的好奇心,我检查了它是否一直都是这样,事实证明它实际上确实如此。 在 JDK 1.1.8 和 JDK 1.2.2 中都转到 ,但是没有任何参数的输出不会。java -versionstderrjava.exe


答案 1

Java-version的结果去stderr有什么特殊的原因吗?

AFAIK,没有特别的原因。这只是命令是如何实现的。可能一直追溯到Java 1.0,尽管很难验证这一点。java

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

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


你能/应该做什么?

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

1 - 这里有证据证明它有多不可能:https://bugs.java.com/bugdatabase/view_bug.do?bug_id=4380614。请注意“解决方案:不会修复”...和最后的评论。


答案 2

此问题的解决方法是:

java -version 2> java_version.txt

推荐