让我们尝试重定向标准错误java
:
java -version 2> ~/error.txt
error.txt
已填充版本。
让我们尝试重定向标准输出:
java -version > ~/output.txt
output.txt
是空的。
为什么java
二进制打印正常输出到错误流?
根据Java 文档 http://docs.oracle.com/javase/8/docs/technotes/tools/windows/java.html#BABDJJFI:
-显示版本
显示版本信息并继续执行应用程序。该选项相当于-version
选项,但后者指示 JVM 在显示版本信息后退出。
-version
显示版本信息,然后退出。该选项相当于-showversion
选项,只不过后者在显示版本信息后不指示 JVM 退出。
现在考虑维基百科对 stderr 的定义 http://en.wikipedia.org/wiki/Standard_streams:
标准错误是程序通常用来输出错误消息或诊断信息的另一个输出流。
大多数以 POSIX 为中心的工具都为其标准输出流规定了非常仔细的规范,因此该工具的输出可以通过管道传输到其他地方。 Stderr 的规定要少得多,并且广泛用于记录和错误。
With -showversion
,Java 允许在正在运行的应用程序旁边打印版本信息。但是,如果版本信息打印到stdout
,它与正常的应用程序输出没有区别could伴随它,迫使您自己扫描并删除该输出行。当然,与-version
代替-showversion
,版本字符串很可能is预期的输出,但保持一致性本身就是一个不错的目标。
物有所值,将请求的元数据打印到 stderr 与 stdout 是一个悬而未决的问题 https://stackoverflow.com/q/2199624/1426891,因此除了每个应用程序记录的行为之外,几乎没有什么“标准实践”。
要解决此问题,只需将 stderr 重定向到 stdout:
VERSION=$(java -version 2>&1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)