2012-05-21 12 views

Respuesta

7

Usted puede utilizar waitForProcessOutput que tiene dos Appendables (docs here)

def process = "ls -l".execute() 
def (output, error) = new StringWriter().with { o -> // For the output 
    new StringWriter().with { e ->      // For the error stream 
    process.waitForProcessOutput(o, e) 
    [ o, e ]*.toString()        // Return them both 
    } 
} 
// And print them out... 
println "OUT: $output" 
println "ERR: $error" 
+0

Acepto su respuesta porque es la más concisa hasta ahora. Me pregunto por qué no hay un 'process.error'. – ripper234

+2

principalmente porque usar el miembro .text es peligroso. Si la salida de texto a las secuencias de salida o de error excede el tamaño de la memoria intermedia, el proceso se detendrá hasta que se lea parte de la secuencia. En realidad, es una buena idea cuando no se sabe cuánto tiempo durará la salida (que suele ser el caso de los errores) para usar un hilo separado para capturar la transmisión. – billjamesdev

+0

+1 para el comentario de @BillJames. Como un lado, esto es lo que hace ['waitForProcessOutput'] (https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/ProcessGroovyMethods.java#L206) (crea dos hilos para escuchar el resultado) –

0

Basado en tim_yates responder, lo probé en Jenkins y encontré este tema con múltiples misiones: https://issues.jenkins-ci.org/browse/JENKINS-45575

Así que esto funciona y se también es conciso:

def process = "ls -l".execute() 
def output = new StringWriter(), error = new StringWriter() 
process.waitForProcessOutput(output, error) 
println "exit value=${process.exitValue()}" 
println "OUT: $output" 
println "ERR: $error"