【问题标题】:command line "java -version" will send result to stdOut or stdErr? [duplicate]命令行“java -version”会将结果发送到stdOut或stdErr? [复制]
【发布时间】:2016-03-20 16:14:04
【问题描述】:

我正在编写代码以使用 Win32 API 来检测 java 的版本。例如

基本上,我在关注 MSDN Creating a Child Process with Redirected Input and Output https://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx

string GetJavaVersion(string sJavaExePath) {
}

这是伪客户端代码:

ASSERT(GetJavaVersion("C:\Program Files (x86)\Java\jdk1.7.0_17\bin\java.exe") == "1.7.0_25");

我可以得到如下结果:

java version "1.7.0_25"
Java(TM) SE Runtime Environment (build 1.7.0_25-b17)
Java HotSpot(TM) Client VM (build 23.25-b01, mixed mode, sharing)

但是,结果是从 stdErr 发回的,而我认为它应该从 stdOut 返回。

从stdErr接收字符串有意义吗?

【问题讨论】:

  • 为什么?它在哪里说它进入标准输出?您期望的依据是什么?
  • 不知道Java使用stdout或者stderr的转换。我的基础是在运行期间,“似乎”没有发生错误,所以很直观地期望它会进入标准输出。

标签: java winapi


【解决方案1】:

答案是标准错误。我们可以分别重定向stderr和stdout看看,

$ java -version 2>stderr.txt 1>stdout.txt
$ cat stderr.txt 
java version "1.8.0_66"
Java(TM) SE Runtime Environment (build 1.8.0_66-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)

你也可以将stderr重定向到stdout,

$ java -version 2>&1

这将允许您从标准输出中读取它。

【讨论】:

  • 正是我想知道的。
  • 你知道为什么要写入StdErr吗?一定是有原因的。
  • 我不确定,也许命令行参数处理默认会在 stderr 上产生输出(可能用于日志记录)。请注意,java -help 也在 stderr 上。
  • 为什么?历史原因。请参阅上面的 dup-link。
猜你喜欢
  • 1970-01-01
  • 2017-09-05
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
相关资源
最近更新 更多