...
Groovy provides a simple way to execute command line processes. Simply write the command line as a string and call the exectueexecute() method. E.g., on a *nix machine (or a windows machine with appropriate *nix commands installed), you can execute this:
| Code Block |
|---|
def process = "ls -l".execute()
println "Found text ${process.text}"
|
...
e.g. here is the same command as above but we will now process the resulting stream a line at a time
| Code Block |
|---|
def process = "ls -l".execute()
process.in.eachLine { line -> println line }
|
...
Remember that many commands are shell built-ins and need special handling. So if you want a listing of files in a directory on a windows machine and if you write
| Code Block |
|---|
Process p = "dir".execute()
println "${p.text}"
|
...
This is because "dir" is built-in to the windows shell (cmd.exe) and can't be run as a simple executable. Instead, you will need to write:
| Code Block |
|---|
Process p = "cmd /c dir".execute()
println "${p.text}"
|
...
Here is how to gobble all of the output (including the error stream output) from your process:
| Code Block |
|---|
def p = "rm -rf */*.tmp".execute()
p.consumeProcessOutput()
|
...
Here are some examples of use:
| Code Block |
|---|
proc1 = 'ls'.execute()
proc2 = 'tr -d o'.execute()
proc3 = 'tr -d e'.execute()
proc4 = 'tr -d i'.execute()
proc1 | proc2 | proc3 | proc4
proc4.waitFor()
if (proc4.exitValue())
print proc4.err.text
else
print proc4.text
|
| Code Block |
|---|
def sout = new StringBuffer()
def serr = new StringBuffer()
proc2 = 'tr -d o'.execute()
proc3 = 'tr -d e'.execute()
proc4 = 'tr -d i'.execute()
proc4.consumeProcessOutput(sout, serr)
proc2 | proc3 | proc4
[proc2, proc3].each{ it.consumeProcessErrorStream(serr) }
proc2.withWriter { writer ->
writer << 'testfile.groovy'
}
proc4.waitForOrKill(1000)
println 'sout: ' + sout
println 'serr: ' + serr
|
| Code Block |
|---|
def sout = new StringBuffer()
def serr = new StringBuffer()
proc1 = 'gzip -c'.execute()
proc2 = 'gunzip -c'.execute()
proc2.consumeProcessOutput(sout, serr)
proc1 | proc2
proc1.consumeProcessErrorStream(serr)
proc1.withWriter { writer ->
writer << 'test text'
}
proc2.waitForOrKill(1000)
println 'sout: ' + sout // => test text
println 'serr: ' + serr
|
| Code Block |
|---|
def initialSize = 4096
def outStream = new ByteArrayOutputStream(initialSize)
def errStream = new ByteArrayOutputStream(initialSize)
def proc = "ls.exe".execute()
proc.consumeProcessOutput(outStream, errStream)
proc.waitFor()
println 'out:\n' + outStream
println 'err:\n' + errStream
|
| Code Block |
|---|
def out = new StringBuilder()
def err = new StringBuilder()
def proc = "ls".execute()
proc.waitForProcessOutput(out, err)
if (out) println "out:\n$out"
if (err) println "err:\n$err"
|
...