【问题标题】:Groovy: redirect stdout to a file does not workGroovy:将标准输出重定向到文件不起作用
【发布时间】:2011-12-20 20:14:50
【问题描述】:

我只是在学习 groovy。我有一个非常简单的脚本,可以使用println 向 STDERR 和 STDOUT 输出一些文本:

err = System.err    
resultStr = "test to print"
err.println resultStr
println resultStr

如果我在没有重定向的情况下运行脚本,我会在输出中两次获得resultStr 字符串。

如果我将输出重定向到带有test > test.txt 的文件,则结果字符串会在输出中出现一次(OK),创建test.txt(OK),但它是。我尝试使用 System.out.println 而不是 println 来获得相同的结果。我做错了什么?

如果它很重要,我使用的是 Windows 7。以防万一我尝试重定向标准 Windows 程序的输出,如 dir,它可以工作。

Groovy 版本:1.8.4 JVM:1.7.0_02

更新:我还尝试在 java(相同的 JVM)中创建一个简单的 "Hello World" 类。重定向确实有效。所以它应该是 Groovy 中的东西。

UPDATE 2:@socha23 评论说他可以在 Windows 7 下从同一个脚本成功重定向后,我认为问题不在脚本上,而是在 Groovy 安装、版本冲突或操作系统。所以我问了similar question on SuperUser(很抱歉交叉发布,但我真的认为这是一个边缘问题)。

然后我发现如果我直接以test.groovy > test.txt 运行脚本,重定向将无法正常工作。但如果我运行groovy test.groovy > test.txt,它就可以工作。我仍然想了解这种行为并尽可能纠正。请访问 SU 问题。至于今天 12/24,仍然没有答案。

我认为现在很清楚这不是编程问题。请建议我是否应该从这里删除它。这两个问题是相互引用的。

【问题讨论】:

  • 如果在退出前刷新流,文件是否为空?
  • @RogerLindsjö:我把System.out.flush()放在了脚本的最后,但是文件还是空的。
  • 它在带有 Groovy 1.8.3 的 Mac OS X 上运行良好。我怀疑这是 Windows 7 的问题(尽管这令人惊讶)。
  • 好吧,我明天会尝试重新启动,看看会发生什么。有人可以在 Windows 机器上尝试此代码吗?我正在使用最新的 Groovy 版本。
  • 我刚刚在我的 Windows7 机器上试了一下,效果很好。

标签: java redirect groovy stdout


【解决方案1】:

您运行的是 Windows 7 64 位吗?试试这个来自 MS 的修补程序是否可以解决您的问题:http://support.microsoft.com/kb/971163/en-us 如果输出重定向不适用于某个程序,这可能适用,但控制台上的输出可以。 (由于某种原因,我的机器上没有安装修补程序。)

据我了解,如果您直接调用 groovy,则不涉及对 CreateProcessWithTokenW 的 API 调用,而如果您使用 shell,即“test.groovy > file.txt”,它会调用此 API 函数,导致错误。

更新:

与此同时,我发现此 Hotfix 包含在 Windows 7 SP1 中,这就是为什么它不会安装在您和我的机器上的原因。我发现的唯一其他相关错误是这个:http://support.microsoft.com/kb/321788,但据说它是在 Windows XP 时代修复的。

我强烈怀疑 Windows 中的输出重定向代码仍然包含错误,因为我在使用不同的程序时遇到了与您相同的问题,并且可以通过更改源代码来修复它,但是以一种没有意义的方式。

【讨论】:

  • 谢谢。我已经下载了修复程序,但它说我的操作系统不受支持。它是 Windows 7 Pro 64 位 + SP1。 :( 稍后会检查。
【解决方案2】:

您的结果对我来说很有意义,标准的“>”重定向仅适用于标准输出。在 bash 和我很确定的 DOS 中,您需要执行“2>”才能将标准错误输出重定向到文件。以下脚本至少在 bash 上证明了这一点。 DOS 命令行对我来说几乎是一样的。

System.out.println "Hello Standard Out"
System.err.println "Hello Standard Err"

println "Hello plain-jane println"

简单的重定向测试有 stdout.txt 显示“Hello Standard Out”和“Hello plain-jane println”但不是“Hello Standard Err”,它在控制台上显示。

bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout.txt
Hello Standard Err
bobk-mbp:hello bobk$

我的下一个测试明确重定向标准输出和标准错误,导致 stdout2.txt 显示“Hello Standard Out”和“Hello plain-jane println”,stderr2.txt 显示“Hello Standard Err”。

bobk-mbp:hello bobk$ groovy StderrAndOut.groovy > stdout2.txt 2>stderr2.txt
bobk-mbp:hello bobk$

我很惊讶您的结果与标准 java 中的任何不同,因为您尝试做的与 VM 几乎没有关系,而与 shell 有很大关系。

【讨论】:

  • 请再次阅读问题。我对 STDERR 没有任何问题,我不想重定向它。问题是当我重定向 STDOUT 时,文件被创建但它是空的,并且字符串(打印到标准输出)没有出现在控制台中。到 stderr 的字符串确实按预期显示。
  • 实际上我必须用一些新信息来更新问题。看来问题真的不在于脚本,而在于操作系统。请稍后检查。
猜你喜欢
  • 2012-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多