使用groovy脚本输出作为另一个groovy脚本的输入

时间:2012-07-11 17:04:50

标签: groovy

我会提前道歉,我是groovy的新手。我遇到的问题是我有3个groovy脚本执行不同的功能,我需要从我的主groovy脚本中调用它们,使用脚本1的输出作为脚本2的输入,脚本2的输出作为脚本3的输入。

我尝试过以下代码:

script = new GroovyShell(binding)
script.run(new File("script1.groovy"), "--p",  "$var" ) | script.run(new File("script2.groovy"), "<",  "$var" )

当我运行上面的代码时,第一个脚本成功运行,但第二个脚本根本不运行。

脚本1使用"--p", "$var"代码将int作为参数。这使用以下命令在主脚本中成功运行:script.run(new File("script1.groovy"), "--p", "$var" ) - 脚本1的输出是一个xml文件。

当我在主groovy脚本中独立运行script.run(new File("script2.groovy"), "<", "$var" )时,没有任何反应,系统挂起。

我可以使用groovy script2.groovy < input_file从命令行运行脚本2,它可以正常工作。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您不能将<作为参数传递给脚本,因为当您从命令行运行时,Shell会处理重定向...

将脚本中的输出重定向到其他脚本是非常困难的,并且基本上依赖于您在每个脚本的持续时间内更改System.out(并希望JVM中没有其他内容打印并弄乱您的数据)

最好使用如下的java进程:

鉴于这3个脚本:

script1.groovy

// For each argument
args.each {
  // Wrap it in xml and write it out
  println "<woo>$it</woo>"
}

linelength.groovy

// read input
System.in.eachLine { line ->
  // Write out the number of chars in each line
  println line.length()
}

pretty.groovy

// For each line print out a nice report
int index = 1
System.in.eachLine { line ->
  println "Line $index contains $line chars (including the <woo></woo> bit)"
  index++
}

然后我们可以写这样的东西来获得一个新的groovy流程来依次运行每个流程,并将输出相互管道(使用重载的or operator on Process):

def s1 = 'groovy script1.groovy arg1 andarg2'.execute()
def s2 = 'groovy linelength.groovy'.execute()
def s3 = 'groovy pretty.groovy'.execute()

// pipe the output of process1 to process2, and the output
// of process2 to process3
s1 | s2 | s3

s3.waitForProcessOutput( System.out, System.err )

打印出来:

Line 1 contains 15 chars (including the <woo></woo> bit)
Line 2 contains 18 chars (including the <woo></woo> bit)

答案 1 :(得分:0)

//store standard I/O
PrintStream systemOut = System.out
InputStream systemIn = System.in
//Buffer for exchanging data between scripts
ByteArrayOutputStream buffer = new ByteArrayOutputStream()
PrintStream out = new PrintStream(buffer)
//Redirecting "out" of 1st stream to buffer
System.out = out
//RUN 1st script
evaluate("println 'hello'")
out.flush()
//Redirecting buffer to "in" of 2nd script
System.in = new ByteArrayInputStream(buffer.toByteArray())
//set standard "out"
System.out = systemOut
//RUN 2nd script
evaluate("println 'message from the first script: ' + new Scanner(System.in).next()")
//set standard "in"
System.in = systemIn

结果是:'来自第一个脚本的消息:你好'