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/