java - metodo - Usando citas dentro de getRuntime(). Exec
metodo limpiar consola java (6)
EOF NO es un personaje, por lo que no hay forma de escribir un EOF. Olvidaste cerrar una cadena entre comillas.
Me gustaría invocar bash usando una cadena como entrada. Algo como:
sh -l -c "./foo"
Me gustaría hacer esto desde Java. Desafortunadamente, cuando intento 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"?
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");
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 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 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;/""
});
Probablemente la causa de este error sea 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.
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. :-))
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;