我只是在学习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日,它仍然没有答案。
我认为现在很清楚,这不是一个编程问题。如果我应该从这里删除它,请建议。这两个问题都是相互提及的。
答案 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有很大关系。