Hola, hemos encontrado la solución a tu interrogante, has scroll y la obtendrás aquí.
Solución:
Escriba un script y ejecútelo en lugar de comandos separados.
Pipe es una parte del caparazón, por lo que también puedes hacer algo como esto:
String[] cmd =
"/bin/sh",
"-c",
"ls /etc ;
Process p = Runtime.getRuntime().exec(cmd);
Me encontré con un problema similar en Linux, excepto que era “ps -ef | grep someprocess”.
Al menos con “ls” tiene un reemplazo de Java independiente del idioma (aunque más lento). P.ej.:
File f = new File("C:\");
String[] files = f.listFiles(new File("/home/tihamer"));
for (String file : files)
if (file.matches(.*some.*)) System.out.println(file);
Con “ps”, es un poco más difícil, porque Java no parece tener una API para ello.
Escuché que Sigar podría ayudarnos: https://support.hyperic.com/display/SIGAR/Home
Sin embargo, la solución más simple (como señaló Kaj) es ejecutar el comando canalizado como un string array. Aquí está el código completo:
try
String line;
String[] cmd = "/bin/sh", "-c", "ps -ef ;
Process p = Runtime.getRuntime().exec(cmd);
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()));
while ((line = in.readLine()) != null)
System.out.println(line);
in.close();
catch (Exception ex)
ex.printStackTrace();
En cuanto a por qué la cadena array funciona con tubería, mientras que una sola string no… es uno de los misterios del universo (especialmente si no has leído el código fuente). Sospecho que es porque cuando al ejecutivo se le da un solo string, lo analiza primero (de una manera que no nos gusta). Por el contrario, cuando al ejecutivo se le da una string arraysimplemente lo pasa al sistema operativo sin analizarlo.
En realidad, si nos tomamos un tiempo de un día ajetreado y miramos el código fuente (en http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/ Runtime.java#Runtime.exec%28java.lang.String%2Cjava.lang.String[]%2Cjava.io.File%29), encontramos que eso es exactamente lo que está sucediendo:
public Process [More ...] exec(String command, String[] envp, File dir)
throws IOException
if (command.length() == 0)
throw new IllegalArgumentException("Empty command");
StringTokenizer st = new StringTokenizer(command);
String[] cmdarray = new String[st.countTokens()];
for (int i = 0; st.hasMoreTokens(); i++)
cmdarray[i] = st.nextToken();
return exec(cmdarray, envp, dir);
Cree un tiempo de ejecución para ejecutar cada uno de los procesos. Obtenga el OutputStream del primer tiempo de ejecución y cópielo en el InputStream del segundo.
Tienes la opción de añadir valor a nuestra información contribuyendo tu veteranía en las interpretaciones.