2012-10-07 11 views
5

Ich bin ein Scala Anfänger und ich schreibe einen Wrapper zum Aufrufen von Shell-Befehlen. Momentan versuche ich Shell-Befehle mit Pipes aus einem angegebenen Verzeichnis aufzurufen.Scala - Shell Befehle mit Pipe

Um dies zu erreichen, schrieb ich einfaches Programm:

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()); 
} 

jedoch mit diesem Programm ich Rohre beispielsweise nicht verwenden kann:

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

Zuerst dachte ich, dass Rohre Funktionalität Shell sind, Also habe ich "/ bin/sh -c ps -eF | grep -i foo" versucht, aber es scheint, dass der Ausdruck von der rechten Seite der Pipe ignoriert wurde.

Ich habe auch versucht, Befehle mit! Syntax (sys.process._ Paket), aber ich konnte nicht herausfinden, wie man den Befehl aus dem angegebenen Verzeichnis (ohne "CD") aufrufen.

Können Sie mir bitte raten, wie man das richtig macht?

+0

@xhochy OK. Ich habe den Kommentar entfernt, damit niemand ihn versehentlich verwenden kann. :) –

Antwort

6

ändern

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

zu

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

Oder Sie könnten direkt die Magie von Scala zur Verfügung gestellt verwenden:

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

Leider hat es nicht funktioniert. Ich bekomme diesen Fehler: -eF: -c: Zeile 0: unerwartete EOF bei der Suche nach passenden ''' -eF: -c: Zeile 1: Syntaxfehler: unerwartetes Ende der Datei – altanis

+0

@altanis Oh, scheint Scala zu entfernen "Zecken manchmal. Ich habe meine Antwort mit einer Lösung aktualisiert, die funktionieren sollte (ich denke, das Beste wäre, die Scala-Magie zu verwenden, wenn Sie die Pipe als Funktion eingeben (das letzte Beispiel). – xhochy

+0

@altanis - Scheint, dass Sie ein redundantes Zitat in Ihrem Befehl haben. Versuchen Sie, die 'directory.getAbsolutePath +"; "+ Befehl" zu drucken, vielleicht würde das lösen. – Rogach