如何将控制台命令作为字符串返回到正在运行的软件?

时间:2012-11-28 15:10:36

标签: linux shell grails groovy terminal

让我举一个简单的例子:
在Linux环境中,我有一个Grails脚本,我想使用 ls 命令获取所有目录:

def ls = "ls".execute()
println ls
// result is java.lang.UNIXProcess@f16b42

我想获得与终端相同的输出

,而不是获取进程ID

Ps。:这只是一个例子,我真的不需要列出目录。

2 个答案:

答案 0 :(得分:2)

快速的方法是:

String output = 'ls'.execute().text
println output

无论其!如果它写了很多输出,读者将填满,然后它将全部阻止。所以,你需要做类似的事情:

String output = new StringWriter().with { out ->
    Process proc = 'ls'.execute()
    proc.consumeProcessOutput( out, System.err )
    proc.waitFor()
    out.toString()
}
println output

当然,您可能需要检查proc.waitFor()返回的exitCode,并使用错误流做更好的事情,然后将其发送到System.err,但您明白了这一点; - )

答案 1 :(得分:1)

您也可以这样做。

File directory = new File(args[0])
Process p = "ls".execute([], directory)            
p.waitForProcessOutput(System.out, System.err)         

如果这是一个名为listFiles.groovy的脚本,则可以运行

groovy listFiles ~/blah

并查看blah目录中的所有内容。在进入任何其他命令之前,这将等待该过程完成。

查看Process的常规文档。那里有很多有趣的东西。