Groovy执行shell命令
 Groovy将execute方法添加到String以使执行的shell非常容易; 
 println "ls".execute().text 
但是如果发生错误,那么没有结果输出。 有没有一个简单的方法来获得标准的错误和标准? (除了创build一堆代码;创build两个线程来读取两个inputstream,然后使用父stream等待它们完成,然后将string转换回文本?)
有这样的事情会很高兴;
  def x = shellDo("ls /tmp/NoFile") println "out: ${x.out} err:${x.err}" 
	
好吧,自己解决
 def sout = new StringBuilder(), serr = new StringBuilder() def proc = 'ls /badDir'.execute() proc.consumeProcessOutput(sout, serr) proc.waitForOrKill(1000) println "out> $sout err> $serr" 
显示:
 out> err> ls: cannot access /badDir: No such file or directory 
  "ls".execute()返回一个Process对象,这就是为什么"ls".execute().text有效。 您应该能够只读取错误stream,以确定是否有任何错误。 
  Process上有一个额外的方法,允许您传递一个StringBuffer来检索文本: consumeProcessErrorStream(StringBuffer error) 。 
例:
 def proc = "ls".execute() def b = new StringBuffer() proc.consumeProcessErrorStream(b) println proc.text println b.toString() 
 // 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() } 
为上面提供的答案增加一个更重要的信息 –
对于一个过程
 def proc = command.execute(); 
总是尝试使用
 def outputStream = new StringBuffer(); proc.waitForProcessOutput(outputStream, System.err) //proc.waitForProcessOutput(System.out, System.err) 
而不是
 def output = proc.in.text; 
在groovy中执行命令后捕获输出,因为后者是一个阻塞调用( SO问题 )。
我觉得这更习惯:
 def proc = "ls foo.txt doesnotexist.txt".execute() assert proc.in.text == "foo.txt\n" assert proc.err.text == "ls: doesnotexist.txt: No such file or directory\n" 
另一个post提到,这些是阻止呼叫,但由于我们想要处理输出,这可能是必要的。
 def exec = { encoding, execPath, execStr, execCommands -> def outputCatcher = new ByteArrayOutputStream() def errorCatcher = new ByteArrayOutputStream() def proc = execStr.execute(null, new File(execPath)) def inputCatcher = proc.outputStream execCommands.each { cm -> inputCatcher.write(cm.getBytes(encoding)) inputCatcher.flush() } proc.consumeProcessOutput(outputCatcher, errorCatcher) proc.waitFor() return [new String(outputCatcher.toByteArray(), encoding), new String(errorCatcher.toByteArray(), encoding)] } def out = exec("cp866", "C:\\Test", "cmd", ["cd..\n", "dir\n", "exit\n"]) println "OUT:\n" + out[0] println "ERR:\n" + out[1] 
 command = "ls *" def execute_state=sh(returnStdout: true, script: command) 
但如果命令失败,进程将终止