A string can be executed in the standard java way: def command = """executable arg1 arg2 arg3"""// Create the String def proc = command.execute() // Call *execute* on the string proc.waitFor() // Wait for the command to finish // Obtain status and output println "return code: ${ proc.exitValue()}" println "stderr: ${proc.err.text}" println "stdout: ${proc.in.text}" // *out* from the external program is *in* for groovy
Gotchas: Take care if you wish to pass a quoted argument that contains white space – it will be split into multiple arguments, e.g.:java
"""executable "first with space" second""".execute()
will invoke executable with the following arguments:shell
In such a case, you may prefer to use one of the array or list of String variations, e.g.:bash
["executable", "first with space", "second"].execute()
def proc = "ffmpeg -i /tmp/sample.m4a -f ffmetadata 2>&1 | grep Duration".execute()ui
是不行的,the '2>1&1' bit is shell functionality, and Groovy processes don't invoke the shell, they just start a program. If you really need it, you should do something like:spa
def proc1 = ['/bin/bash', '-c', '/usr/local/bin/ffmpeg -i /tmp/sample.m4a -f ffmetadata 2>&1'].execute()code
or similar - do some experimenting. That is, you need to call the shell with the command you want executed as argument.ip
Ant has an exec task and it be accessed from the AntBuilder object字符串
def ant = new AntBuilder() // create an antbuilder ant.exec(outputproperty:"cmdOut", errorproperty: "cmdErr", resultproperty:"cmdExit", failonerror: "true", executable: '/opt/myExecutable') { arg(line:"""*"first with space"* second""") } println "return code: ${ant.project.properties.cmdExit}" println "stderr: ${ant.project.properties.cmdErr}" println "stdout: ${ ant.project.properties.cmdOut}"