2010-09-23 11 views
28

Estoy intentando utilizar ProcessBuilder clase de Java para ejecutar un comando que tiene un tubo en ella. Por ejemplo:Uso de Java ProcessBuilder para ejecutar un comando Hilo

ls -l | grep foo 

Sin embargo, me da un error:

ls: |: no such file or directory 

Seguido por:

ls: grep: no such file or directory 

A pesar de que el comando funciona perfectamente desde la línea de comandos, no puedo conseguir ProcessBuilder para ejecutar un comando que redirige su salida a otro. ¿Hay alguna forma de lograr esto?

Respuesta

5

La forma más sencilla es invocar la cáscara con la línea de comandos como el parámetro. Después de todo, es el intérprete de comandos el que interpreta "|" para significar "canalizar los datos entre dos procesos".

Como alternativa, puede lanzar cada proceso por separado, y leer desde la salida estándar de "ls -l", escribir los datos en la entrada estándar de "grep" en su ejemplo.

+0

Parece ser una buena opción, mejor que ejecutar varios shells para obtener la salida adecuada. ¡Gracias! – LeoPucciBr

45

Esto debería funcionar:

ProcessBuilder b = new ProcessBuilder("/bin/sh", "-c", "ls -l| grep foo"); 

Para ejecutar una tubería, que tiene que invocar un shell y ejecute los comandos dentro de esa concha.

+0

Por alguna razón también que tenía que hacer esto para 'ls/dev/sd *' OIA, 'ProcessBuilder pb = new ProcessBuilder ("/ bin/sh", "c", "ls/dev/sd *"); 'funciona muy bien, mientras que' ProcessBuilder pb = new ProcessBuilder ("ls", "/ dev/sd *"); 'did * not * work. Supongo que tiene algo que ver con la interpretación vararg del '*' en la cadena ... Parece un error para mí. También podría ser debido al dispositivo 'especial ''/dev', no estoy seguro. – likethesky

+1

Es el caparazón que expande el comodín, no ls. Si escribió 'ls '/ dev/sd *'', tampoco funcionaría. –

Cuestiones relacionadas