Groovy执行Shell命令


178

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

println "ls".execute().text

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

有这样的事情会很好;

 def x = shellDo("ls /tmp/NoFile")
 println "out: ${x.out} err:${x.err}"

链接很有用。显示如何使用cURL演示运行shell命令。
Aniket Thakur 2014年

Answers:


207

好吧,我自己解决了;

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


13
如果您还需要为此过程设置环境变量,请确保将命令包装在shell中。例如,运行带有env vars的Perforce命令:envVars = ["P4PORT=p4server:2222", "P4USER=user", "P4PASSWD=pass", "P4CLIENT=p4workspace"]; workDir = new File("path"); cmd = "bash -c \"p4 change -o 1234\""; proc = cmd.execute(envVars, workDir);
Noam Manos 2013年

@paul_sns与OP问题无关,但是我认为现代JVM处理无竞争的同步就可以了。因此,StringBuffer不太可能在线程受限或堆栈受限的情况下降低性能。
Pavel Grushetzky

3
文档说我们应该使用waitForProcessOutput()-“要等待输出被完全消耗,请调用waitForProcessOutput()”。资料来源:docs.groovy-lang.org/latest/html/groovy-jdk/java/lang/…–
Srikanth

4
@srikanth waitForProcess()输出文档还说:“如果您不关心标准或错误输出,只希望进程静默运行,请使用此方法”-我想要输出
Bob Herrmann

即使在waitForOrKill之后,sout和serr也可能不可用。使用断言而不是println进行测试。文档说:“为此,启动了两个线程,因此该方法将立即返回。即使调用waitFor(),也不会加入线程。要等待输出被完全消耗,请调用waitForProcessOutput() ”。
solstice333
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.