2012-10-07 24 views
5

Scala'ya yeni başladım ve kabuk komutlarını çağırmak için bir sarıcı yazıyorum. Şu anda belirli bir dizinden borularla kabuk komutları çağırmaya çalışıyorum. , Borular kabuğun işlevselliği olduğunu,Scala - boruyla kabuk komutları

runCommand("ps -eF | grep -i foo", new File(".")); 

İlk düşündüm: örneğin, Ancak Boruları kullanamazsınız Bu yardımcı programı ile

def runCommand(command: String, directory: File): (Int, String, String) = { 

    val errbuffer = new StringBuffer(); 
    val outbuffer = new StringBuffer(); 

    //run the command 
    val ret = sys.process.Process(command, directory) ! 
    //log output and err 
    ProcessLogger(outbuffer append _ + "\n", outbuffer append _ + "\n"); 

    return (ret, outbuffer.toString(), errbuffer.toString()); 
} 

:

Ben basit programı yazdım Bunu başarmak için bu yüzden "/ bin/sh -c ps -eF | grep -i foo" yu denedim, fakat bu, borunun sağ tarafındaki ifadenin göz ardı edildiğini gösteriyor.

Ayrıca komutları çalıştırmayı denedim! sözdizimi (sys.process._ paketi), ancak ben, belirtilen dizinden ("cd" kullanmadan) komut çağırmak nasıl olduğunu anlayamadım.

Lütfen bu konuda nasıl yardımcı olabileceğinizi bana bildirir misiniz?

+0

@xhochy. Yorumu, kimsenin yanlışlıkla kullanamaması için kaldırdım. :) –

cevap

6

Değişim

val ret = sys.process.Process(command, directory) ! 

val ret = sys.process.stringSeqToProcess(Seq("/bin/bash", "-c", "cd " + directory.getAbsolutePath + ";" + command)) 

için Veya doğrudan Scala tarafından sağlanan büyü kullanabilirsiniz: Tamam

import.scala.sys.process._ 
val ret = "ps -ef" #| "grep -i foo" ! 
+0

Maalesef işe yaramadı. Bu hatayı alıyorum: -eF: -c: satır 0: '' ' -eF: -c: line 1: sözdizimi hatası: eşleşme için beklenmedik EOF: – altanis

+0

@altanis Oh, Scala kaldırılır gibi görünüyor. Bazen keneler. Cevabımı işe yarayacak bir çözümle güncelledim (bence en iyisi boruya bir işlev olarak girdiğiniz Scala sihrini kullanmaktır (son örnek) – xhochy

+0

@altanis - Komutunuzda gereksiz bir teklifiniz var gibi görünüyor. "Directory.getAbsolutePath +", "+ komut" yazdırmayı deneyin, belki de bunu çözer. – Rogach

İlgili konular