2016-03-28 15 views
2

Komut çalıştıran bir Exec görevim var (Inkscape, "no-gui" modunda). Bu komut inanılmaz derecede gürültülüdür ve stderr'e çok fazla önemsiz uyarıda bulunma eğilimindedir. Ancak stderr'e gönderdiği bazı şeyler yararlıdır, bu yüzden stderr'ini tamamen bastırmak istemiyorum.Bir grapet Exec görevinde stderr'i filtrelemenin kolay bir yolu var mı?

Şu anda bildiğim stderr iletilerini filtrelemek için grep -v kullanan bir sarmalayıcı kabuk komut dosyası var. Daha sonra Exec görevimin bu betiği çağırmasını istiyorum.

Bunu daha da müstakil bir hale getirmenin bir yolu olup olmadığını merak ediyorum, bu yüzden harici bir kabuk komut dosyasına güvenmem gerekmiyor.

#!/bin/bash 
svg="$1" 
png="$2" 

exec inkscape -z -D -w 48 -e "$png" "$svg" 2> >(
    grep -v '^\*\* (inkscape:[0-9]*): CRITICAL \*\*: dbus_g_' | 
    grep -v '^$' | 
    grep -v '^Failed to get connection$' >&2 
) 

(Evet, ister inanın ister inanmayın, bu "KRİTİK" hataları önemsiz şunlardır:

task createIcon(type:Exec) { 
    def outdir = new File(fromSvgDir, "drawable-ldpi/") 
    outputs.dir(outdir) 
    doFirst { 
     outdir.mkdirs() 
    } 
    def svg = 'src/images/ic_launcher.svg' 
    inputs.source(new File(svg)) 
    def png = new File(outdir, "ic_launcher.png") 
    outputs.file(png) 
    commandLine "$workingDir/svgToPng.sh", svg, png 
} 

ve svgToPng.sh şuna benzer:


Benim gradle görev şuna benzer ve Inkscape aslında bunlara rağmen yapması gereken şeyi yapmayı başarır.)

+1

Ne var bir istisna atarak yapı durdurabilir Şu an? –

+1

@tim_yates Sorunun güncellemesine bakın. –

+0

Hmm, işlemi dışarıdan akışa filtreleyip filtrelemediğinizden emin değilsiniz, ancak çıkışı kendi akışınıza kaydedebilir ve işlemden * sonra * istediğiniz herhangi bir işleme/filtreleme/baskı işlemini gerçekleştirebilirsiniz. – RaGe

cevap

2

Bu test değil ama bu bazı varyasyon olasılıkla çalışacaktır:

task createIcon << { 
    def os = new ByteArrayOutputStream() 

    def result = exec { 
     def outdir = new File(fromSvgDir, "drawable-ldpi/") 
     outputs.dir(outdir) 
     doFirst { 
      outdir.mkdirs() 
     } 
     def svg = 'src/images/ic_launcher.svg' 
     inputs.source(new File(svg)) 
     def png = new File(outdir, "ic_launcher.png") 
     outputs.file(png) 
     commandLine "$workingDir/svgToPng.sh", svg, png 
     standardOutput = os 
    } 

    def outputAsString = os.toString() 
    def match = outputAsString =~ /somepattern/ 
    println match 
} 

Ayrıca belirli maçlarda bağlı

throw new GradleException('error occurred') 
+0

Evet, 'errorOutput' kullanarak istediğimi yapmalıyım. Şimdi sadece bir çeşit "GrepFilterOutputStream" ye ihtiyacım var. –