2011-05-04 17 views
5

Tengo un programa que es:¿Cómo obtengo el código de salida del comando bash de una ejecución de proceso desde Java?

import java.io.*; 
    import java.util.*; 

    public class ExecBashCommand { 
    public static void main(String args[]) throws IOException { 

     if (args.length <= 0) { 
     System.err.println("Need command to run"); 
     System.exit(-1); 
     } 

     Runtime runtime = Runtime.getRuntime(); 
     Process process = runtime.exec("./nv0914 < nv0914.challenge"); 
     Process process1 = runtime.exec("echo ${?}"); 
     InputStream is = process1.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 

     //System.out.printf("Output of running %s is:", Arrays.toString(args)); 

     while ((line = br.readLine()) != null) { 
     System.out.println(line); 
     } 

    } 
    } 

nota: nv0914 es un archivo ejecutable bash y nv0914.challenge es un archivo de texto. Cuando ejecuto cualquier comando normal en el terminal y justo después de eso si verifico el código de salida usando echo ${?}. Ahora quiero hacer lo mismo usando un programa, pero el programa simplemente está dando el resultado ${?}. ¡Por favor, ayúdame!

+3

¿Qué pasa con [process.exitValue()] (http://download.oracle.com/javase/6/docs/api/java/lang/Process.html#exitValue())? – eggyal

+0

Remonté el último cambio a la pregunta, en la que el OP implementó parcialmente la solución que proporcionó Peter Lawrey. Este fue un cambio material a la pregunta y realmente lo hizo inutilizable, IMO, para los lectores futuros. –

Respuesta

17

Process.waitFor() devuelve int Ahí es donde se devuelve el código de salida. Si comienza un programa no relacionado, no tendrá un código de salida anterior, por lo que no devuelve nada útil.

No puede usar exitValue() de manera confiable porque podría llamarlo antes de que el programa haya finalizado. Sólo se debe llamar después de llamar waitFor() (y va a dar el código waitFor misma salida() lo hace)

Desde el Javadoc para exitValue

Lanza: IllegalThreadStateException - si el subproceso representado por este proceso objeto aún no ha terminado.

+2

cree que los argv a echo son interpretados por un intérprete de comandos antes de que echo los capte, pero no es así. –

+0

Hola Peter, gracias por el comentario ... pero me está dando un error. – Maverick

+1

@ mad-programmer, Necesita manejar la InterruptedException. ;) –

Cuestiones relacionadas