Goal: execute a program via a command line from groovy code
Option 1: executing a string
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.:
"""executable "first with space" second""".execute()
will invoke executable with the following arguments:
- arg1 = "first
- arg2 = with
- arg3 = space"
- arg4 = second
In such a case, you may prefer to use one of the array or list of String variations, e.g.:
["executable", "first with space", "second"].execute()
Option 2: using ant builder's exec task
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}"
The good thing is that you now have all the ant features at your disposal and Ant will not break up quoted args containing whitespace.
See also: Process Management