让我们尝试重定向标准错误java:
java -version 2> ~/error.txt
Run Code Online (Sandbox Code Playgroud)
error.txt 填充版本.
让我们尝试重定向标准输出:
java -version > ~/output.txt
Run Code Online (Sandbox Code Playgroud)
output.txt 是空的.
为什么java二进制打印正常输出到错误流?
根据Java文档:
-showversion
显示版本信息并继续执行应用程序.此选项等同于该
-version选项,但后者指示JVM在显示版本信息后退出.-版
显示版本信息,然后退出.此选项等同于该
-showversion选项,除了后者在显示版本信息后不指示JVM退出.
现在考虑维基百科对stderr的定义:
标准错误是程序通常用于输出错误消息或诊断的另一个输出流.
大多数以POSIX为中心的工具都为其stdout流规定了非常仔细的规范,因此工具的输出可以在其他地方输出.Stderr的规定要少得多,并且可以自由地用于记录和错误.
使用-showversion,Java允许将版本信息打印在正在运行的应用程序旁边.但是,如果版本信息被打印到stdout,它将与它可能伴随的正常应用程序输出无法区分,迫使您自己扫描并删除该行输出.当然,-version代替-showversion版本字符串很可能是预期的输出,但保持一致性本身就是一个不错的结局.
对于它的价值,将请求的元数据打印到stderr vs stdout是一个悬而未决的问题,因此除了每个应用程序记录的行为之外,"标准实践"几乎没有.
要解决此问题,只需将stderr重定向到stdout:
VERSION=$(java -version 2>&1)
Run Code Online (Sandbox Code Playgroud)