2012-10-07 18 views
5

Soy un principiante de Scala y estoy escribiendo un contenedor para invocar comandos de shell. Actualmente estoy intentando invocar comandos de shell con pipes desde un directorio especificado.Scala - comandos de shell con tubería

Para lograr esto escribí sencilla utilidad:

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

Sin embargo, con esta utilidad no puedo usar tuberías, por ejemplo:

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

Primero pensé, que las tuberías son la funcionalidad de la cáscara, así que probé "/ bin/sh -c ps -eF | grep -i foo", pero parece que la expresión de la derecha de la tubería fue ignorada.

¡También intenté ejecutar comandos con! sintaxis (sys.process._ package), pero no pude entender cómo llamar al comando desde el directorio especificado (sin usar "cd").

¿Podría aconsejarme cómo hacerlo correctamente?

+0

@xhochy OK. Eliminé el comentario para que nadie pueda usarlo accidentalmente. :) –

Respuesta

6

Cambio

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

a

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

O puede utilizar directamente la magia proporcionada por Scala:

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

Lamentablemente no funcionó. Me aparece este error: -eF: -c: línea 0: EOF inesperado mientras buscaba el correspondiente ''' -eF: -c: línea 1: error de sintaxis: inesperado al final del archivo – altanis

+0

@altanis Oh, Scala parece eliminar el 'ticks a veces. Actualicé mi respuesta con una solución que debería funcionar (creo que lo mejor sería usar la magia de Scala en la que ingresas al conducto como una función (el último ejemplo). – xhochy

+0

@altanis - Parece que tienes un presupuesto redundante en tu comando. Intente imprimir 'directory.getAbsolutePath +"; "+ command' en la salida, tal vez eso lo resolvería. – Rogach

Cuestiones relacionadas