Pregunta

Me gustaría invocar a 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 utilizando getRuntime (). Exec , aparece 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 que no termina con un EOF.

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

¿Fue útil?

Solución

Usa esto:

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

Punto principal: no ponga las comillas dobles. ¡Esto solo se usa cuando se escribe una línea de comandos en el shell!

por ejemplo, echo " ¡Hola, mundo! " (como se escribe en el shell) se traduce a:

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

(Solo olvida por el momento que el shell normalmente tiene un código incorporado para echo , y está llamando a / bin / echo en su lugar. :-))

Otros consejos

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 tal como está después del nombre ejecutable (y el espacio). Luego, depende del programa analizar la línea de comandos (lo que generalmente se hace de manera implícita y el programador a menudo no tiene idea).

En GNU / Linux, el shell procesa la línea de comando y genera la matriz familiar de cadenas que se pasa a la principal de C. No tienes esa concha. El mejor enfoque (incluso en Windows) es utilizar la forma de exec donde se pasa cada argumento de la línea de comandos individualmente en su propia Cadena.

Puedes obtener un shell para el análisis si realmente quieres. Lo que haría que tu ejemplo se viera como (sin probar):

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

EOF NO es un carácter, por lo que no hay forma de escribir un EOF. Has olvidado cerrar una cadena entre comillas.

Lo más probable es que 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 haya encontrado. Busque "ifs", "fors", etc. que no hayan finalizado ni se hayan cerrado.

Las citas deben escaparse dentro de una cadena. En lugar de escribir " escribir \ " ;.

Por ejemplo,

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

si fuera usted, escribiría el contenido de la cadena en un archivo de base temporal 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;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top