【问题标题】:Why does 'java -version' go to stderr?为什么'java -version'会进入stderr?
【发布时间】:2012-11-09 02:59:27
【问题描述】:

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 的输出不会。

【问题讨论】:

  • 这几乎是 *NIX 命令的标准。
  • 可悲的是,javac -version 这样也很奇怪。解决方法:java -version 2>&1 | egrep 'java|version' --color

标签: java stdout stderr


【解决方案1】:

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

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

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

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


你可以/应该做什么?

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

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

【讨论】:

    【解决方案2】:

    这个问题的解决方法是:

    java -version 2> java_version.txt
    

    【讨论】:

    • 感谢您的回答。这很有帮助,但没有回答我的问题。我想知道这个设计背后是否有什么特殊原因。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-20
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多