Usando citas dentro de getRuntime (). Exec

Me gustaría invocar bash usando una cadena como entrada. Algo como:

sh -l -c "./foo" 

Me gustaría hacer esto desde Java. Lamentablemente, cuando bash invocar el comando usando getRuntime().exec , getRuntime().exec 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 que mi cadena no se termine 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”?

Utilizar esta:

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

Punto principal: no coloque las comillas dobles. ¡Eso solo se usa cuando se escribe una línea de comandos en el intérprete de comandos!

por ejemplo, echo "Hello, world!" (como se escribe en el shell) se traduce a:

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

(Solo olvide por el momento que el intérprete de comandos normalmente tiene un built-in para el echo , y está llamando /bin/echo lugar. :-))

Las líneas de comando de Windows son diferentes a las 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 progtwig analizar la línea de comando (lo que generalmente se hace implícitamente y el progtwigdor a menudo no tiene ni idea).

En GNU / Linux, el shell procesa la línea de comando y genera la conocida matriz 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 le haría a su ejemplo parecerse a algo (no probado):

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

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

Probablemente la causa de este error sea un token de syntax 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.

Las citas deben ser escapadas cuando están dentro de una cadena. En lugar de escribir “escribir”.

P.ej

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

si yo fuera tú, escribiría el contenido de la cadena en un archivo temporal y vería si bash lo ejecuta sin ningún error. Si eso se ejecuta sin un error, entonces consideraría la depuración adicional;