举个简单的例子:
在 Linux 环境中,我有一个 Grails 脚本,我想使用ls命令获取所有目录:
def ls = "ls".execute()
println ls
// result is java.lang.UNIXProcess@f16b42
我不想获得进程 ID,而是想获得与终端相同的输出
Ps.:这只是一个例子,我真的不需要列出目录。
快速的方法是:
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
,但您明白了 ;-)
你也可以做这样的事情。
File directory = new File(args[0])
Process p = "ls".execute([], directory)
p.waitForProcessOutput(System.out, System.err)
如果这是一个名为 listFiles.groovy 的脚本,您可以运行
groovy listFiles ~/blah
并查看 blah 目录中的所有内容。这将等待该过程完成,然后再执行任何其他命令。
查看Process的 groovy 文档。那里有很多有趣的东西。