我会提前道歉,我是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,它可以正常工作。
非常感谢任何帮助。
答案 0 :(得分:1)
您不能将<
作为参数传递给脚本,因为当您从命令行运行时,Shell会处理重定向...
将脚本中的输出重定向到其他脚本是非常困难的,并且基本上依赖于您在每个脚本的持续时间内更改System.out
(并希望JVM中没有其他内容打印并弄乱您的数据)
最好使用如下的java进程:
鉴于这3个脚本:
// For each argument
args.each {
// Wrap it in xml and write it out
println "<woo>$it</woo>"
}
// read input
System.in.eachLine { line ->
// Write out the number of chars in each line
println line.length()
}
// 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
结果是:'来自第一个脚本的消息:你好'