// a wrapper closure around executing a string
// can take either a string or a list of strings (for arguments with spaces)
// prints all output, complains and halts on error
def runCommand = { strList ->
assert ( strList instanceof String ||
( strList instanceof List && strList.each{ it instanceof String } ) \
)
def proc = strList.execute()
proc.in.eachLine { line -> println line }
proc.out.close()
proc.waitFor()
print "[INFO] ( "
if(strList instanceof List) {
strList.each { print "${it} " }
} else {
print strList
}
println " )"
if (proc.exitValue()) {
println "gave the following error: "
println "[ERROR] ${proc.getErrorStream()}"
}
assert !proc.exitValue()
}
7条答案
按热度按时间swvgeqrz1#
好吧,我自己解决了;
显示器:
out> err> ls: cannot access /badDir: No such file or directory
imzjd6km2#
"ls".execute()
返回一个Process
对象,这就是"ls".execute().text
工作的原因。您应该能够读取错误流以确定是否存在任何错误。Process
上有一个额外的方法,允许您传递一个StringBuffer
来检索文本:consumeProcessErrorStream(StringBuffer error)
.示例:
biswetbf3#
wpx232ag4#
我觉得这句话更地道:
正如另一篇文章提到的,这些都是阻塞调用,但由于我们希望处理输出,这可能是必要的。
chhkpiq45#
在前面的答案中再添加一条重要信息:
对于一个过程
总是尝试使用
而不是
捕获在Groovy中执行命令后的输出,因为后者是一个阻塞调用(SO question for reason)。
wkyowqbh6#
ikfrs5lh7#
但如果命令失败,则过程将终止。