2012-05-21 11 views

cevap

7

Sen tim_yates cevap dayanarak iki 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

Cevabınızı kabul edeceğim çünkü şu ana kadarki en özlü. Merak ediyorum neden bir process.error 'yoktur. Özellikle, .text öğesinin kullanılması tehlikeli olduğundan, – ripper234

+2

. Çıktı veya hata akışlarına giden metin çıktısı, arabellek değerini aşarsa, akışınız bir kısmı okunana kadar işleminiz durur. Aslında, akışı yakalamak için çıktının ne kadar süreceğini (genellikle hatalar için de geçerli) bilmediğinizde, iyi bir fikirdir. @BillJames yorumu için – billjamesdev

+0

+1. Bir kenara göre, bu ['waitForProcessOutput'] (https://github.com/groovy/groovy-core/blob/master/src/main/org/codehaus/groovy/runtime/ProcessGroovyMethods.java#L206) (çıkışı dinlemek için iki iş parçacığı oluşturur) –

0

alır waitForProcessOutput kullanabilirsiniz, ben Jenkins üzerinde denedim ve çoklu atama ile bu sorunu bulundu: https://issues.jenkins-ci.org/browse/JENKINS-45575

Yani bu çalışır ve ayrıca özlüdür:

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"