2012-10-07 18 views
5

Sono un principiante alla Scala e sto scrivendo un wrapper per invocare comandi shell. Attualmente sto cercando di invocare comandi di shell con pipe da una directory specificata.Scala - comandi shell con pipe

Per raggiungere questo ho scritto semplice utility:

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

Tuttavia, con questo programma di utilità che non posso usare tubi, ad esempio:

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

prima cosa ho pensato, che i tubi sono la funzionalità della shell, così ho provato "/ bin/sh -c ps -eF | grep -i pippo", ma sembra che l'espressione dalla destra della pipe sia stata ignorata.

Ho anche provato a eseguire i comandi con! sintassi (pacchetto sys.process._), ma non sono riuscito a capire come chiamare il comando dalla directory specificata (senza usare "cd").

Potrebbe per favore avvisarmi, come farlo correttamente?

+0

@xhochy OK. Ho rimosso il commento in modo che nessuno possa accidentalmente usarlo. :) –

risposta

6

Change

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

a

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

Oppure si potrebbe usare direttamente la magia fornito da Scala:

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

Purtroppo non ha funzionato. Ottengo questo errore: -eF: -c: riga 0: EOF inatteso mentre cerco l'abbinamento ''' -eF: -c: riga 1: errore di sintassi: fine imprevista del file – altanis

+0

@altanis Oh, Scala sembra rimuovere il 'zecche a volte. Ho aggiornato la mia risposta con una soluzione che dovrebbe funzionare (penso che il meglio sarebbe usare la magia di Scala dove si inserisce la pipe come funzione (l'ultimo esempio) – xhochy

+0

@altanis - Sembra che tu abbia una citazione ridondante nel tuo comando. Prova a stampare "directory.getAbsolutePath +"; "+ comando" per l'output, forse lo risolverebbe. – Rogach

Problemi correlati