2008-10-02 17 views
19

Me gustaría invocar bash usando una cadena como entrada. Algo como:Usando comillas dentro de getRuntime(). Exec

sh -l -c "./foo" 

Me gustaría hacer esto desde Java. Por desgracia, cuando intento de invocar el comando utilizando getRuntime().exec, me sale el siguiente error:

 foo": -c: line 0: unexpected EOF while looking for matching `"' 

     foo": -c: line 1: syntax error: unexpected end of file 

Parece estar relacionado con mi cadena no se pueden terminar con un EOF.

¿Hay alguna forma de insertar un EOF específico de la plataforma en una cadena Java? ¿O debería estar buscando otro enfoque, como escribir en un script temporal antes de invocar "sh"?

+0

¿Aparece el error en tiempo de compilación o en tiempo de ejecución? –

+0

¿Cuál es el código Java que usó para invocar a bash? Las cadenas que usa en ese código Java parecen estar equivocadas. Desafortunadamente, faltan en la publicación, por lo que no es particularmente útil ... – oberlies

Respuesta

39

Utilice esta:

Runtime.getRuntime().exec(new String[] {"sh", "-l", "-c", "./foo"}); 

punto principal: no ponga las comillas dobles en el que sólo se usa cuando se escribe una línea de comandos en el shell.!

por ejemplo, echo "Hello, world!" (como se escribe en la cáscara) se traduce a:.

Runtime.getRuntime().exec(new String[] {"echo", "Hello, world!"}); 

(Sólo se olvide por un momento que la cáscara tiene normalmente una orden interna de echo, y está llamando /bin/echo vez :-))

4

EOF NO es un personaje, por lo que no hay forma de escribir un EOF. Olvidaste cerrar una cadena entre comillas.

0

La causa de este error es muy probablemente un token de sintaxis faltante que bash espera, pero la cadena que pasa termina antes de que bash lo encuentre. Busque ifs, fors, etc. que no tengan cierre fi o hecho.

0

Las comillas deben escaparse cuando están dentro de una cadena. En lugar de escribir "escribir \".

E.g.

strcpy (c, "Esto es una cadena \" con \ "comillas");

7

Las líneas de comando de Windows son diferentes de UNIX, Mac OS X y GNU/Linux.

En Windows, el proceso recibe el texto de entrada como está después del nombre ejecutable (y espacio). Depende del programa analizar la línea de comando (lo que generalmente se hace implícitamente y el programador a menudo no tiene ni idea).

En GNU/Linux, el shell procesa la línea de comando y genera el familiar conjunto de cadenas pasadas a la principal de C. No tienes ese caparazón. El mejor enfoque (incluso en Windows) es utilizar la forma de ejecución donde pasa cada argumento de línea de comando individualmente en su propia Cadena.

Puede obtener un intérprete de comandos para el análisis sintáctico si realmente lo desea. Lo que haría que ser algo como ejemplo (no probado):

Runtime.getRuntime().exec(new String[] { 
    "sh", "-c", "sh -l -c \"echo foo; echo bar;\"" 
}); 
0

si yo fuera usted, me gustaría escribir el contenido de la cadena a una temperatura bashfile y ver si bash ejecuta que sin ningún error. Si eso se ejecuta sin un error, entonces consideraría la depuración adicional;

Cuestiones relacionadas