为了账号安全,请及时绑定邮箱和手机立即绑定

Groovy执行Shell命令

/ 猿问

Groovy执行Shell命令

炎炎设计 2019-12-09 15:11:01

Groovy添加了该execute方法,String以使执行Shell变得相当容易。


println "ls".execute().text

但是如果发生错误,则没有结果输出。 是否有一种简单的方法可以同时消除标准错误和标准? (除了创建一堆代码;创建两个线程来读取两个输入流,然后使用父流等待它们完成,然后将字符串转换回文本?)


有这样的事情会很好;


 def x = shellDo("ls /tmp/NoFile")

 println "out: ${x.out} err:${x.err}"


查看完整描述

3 回答

?
慕桂英3389331

好吧,我自己解决了;


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


查看完整回答
反对 回复 2019-12-09
?
LEATH

"ls".execute()返回一个Process对象,这就是为什么"ls".execute().text起作用。您应该能够只读取错误流,以确定是否存在任何错误。


上还有一个额外的方法,Process可让您传递StringBuffer来检索文本:consumeProcessErrorStream(StringBuffer error)。


例:


def proc = "ls".execute()

def b = new StringBuffer()

proc.consumeProcessErrorStream(b)


println proc.text

println b.toString()


查看完整回答
反对 回复 2019-12-09
?
慕莱坞7535251

// 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()

}


查看完整回答
反对 回复 2019-12-09
  • 3 回答
  • 0 关注
  • 703 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信