java - 为什么 'java -version' 会转到 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 的输出没有任何参数不要。

最佳答案

Is there any special reason for the results of java -version going to stderr?

据我所知,没有特殊原因。这正是 java 命令的实现方式。可能一直追溯到 Java 1.0,尽管很难验证这一点。

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

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


你能/应该做什么?

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

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


更新

在 Java 9 中,他们引入了一些新的“版本”命令行选项。如果你运行 java -help 2>&1 | grep version 针对 Java 11 安装,您将看到以下内容:

$ java -help 2>&1 | grep version
    -version      print product version to the error stream and exit
    --version     print product version to the output stream and exit
    -showversion  print product version to the error stream and continue
    --show-version
                  print product version to the output stream and continue.

因此,如果您使用的是 Java 11 LTS 或更高版本,解决方案是使用 --version 而不是 -version 来获取版本信息。

关于java - 为什么 'java -version' 会转到 stderr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13483443/

相关文章:

java - 创建 SQL 行后立即获取其 ID

java - Vaadin Designer 主题选择器不支持自定义主题

java - 如何对来自不同项目的关联类进行排序

c - Perl system() 需要 stdout 刷新

java 新进程 - 需要从 ErrorStreams 和输出流中获取和读取

c++ - 如何在 C/C++ 中监听 stderr 以发送回调?

java - 读取属性文件时未找到文件异常

bash - 如何将 stdout 和 stderr 重定向到一个文件

go - 连续读取 exec.Cmd 输出

c# - 以正确的顺序捕获进程 stdout 和 stderr