Groovy:将stdout重定向到文件不起作用

时间:2011-12-20 20:14:51

标签: java redirect groovy stdout

我只是在学习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

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

更新2 :@ socha23发表评论后,他可以从Windows 7下的同一个脚本成功重定向,我认为问题不在脚本中,而是在Groovy安装,版本冲突或OS。所以我问similar question on SuperUser(抱歉交叉发布,但我真的认为这是一个临界问题)。

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

我认为现在很清楚,这不是一个编程问题。如果我应该从这里删除它,请建议。这两个问题都是相互提及的。

2 个答案:

答案 0 :(得分:2)

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

据我所知,如果直接调用groovy,则不会调用CreateProcessWithTokenW,而如果使用shell,即“test.groovy> file.txt”,则会调用此API函数,导致错误。

<强>更新

我发现此时此修补程序包含在Windows 7 SP1中,这就是为什么它不会安装在您和我的计算机上。我找到的唯一其他相关错误就是这个:http://support.microsoft.com/kb/321788,但它在Windows XP时代被认为是固定的。

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

答案 1 :(得分:0)

您的结果对我有意义,标准“&gt;”重定向仅适用于标准输出。在bash和,我很确定,DOS,你需要做“2&gt;”将标准错误输出重定向到文件。以下脚本至少在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有很大关系。