2009-03-30 9 views
9

En OS X, estoy tratando de .exec algo, pero cuando una ruta contiene un espacio, no funciona. Intenté rodear la ruta con comillas, escapando del espacio e incluso usando \ u0020.Los espacios en java ejecutan la ruta para OS X

Por ejemplo, esto funciona:

Runtime.getRuntime().exec("open /foldername/toast.sh"); 

Pero si hay un espacio, ninguno de estos funciona:

Runtime.getRuntime().exec("open /folder name/toast.sh"); 

Runtime.getRuntime().exec("open \"/folder name/toast.sh\""); 

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

Runtime.getRuntime().exec("open /folder\u0020name/toast.sh"); 

ideas?

Editar: Barra invertida escapada ... todavía no funciona.

Respuesta

11

Hay un resumen de este problema en Sun's forums ... parece que hay un problema bastante común no restringido a OS X.

El último mensaje en el hilo resume la solución propuesta. En esencia, utilice el formulario de Runtime.exec que tiene una matriz String[]:

String[] args = new String[] { "open", "\"/folder name/toast.sh\"" }; 

o (el foro sugiere que esto también funcionará)

String[] args = new String[] { "open", "folder name/toast.sh" }; 
+0

¡Gracias! FYI Tenía algunas banderas adicionales en el programa real y si usa una matriz como esta, entonces tiene que dividir todo. Ejemplo: String [] args = new String [] {"open", "-n", "folder name/toast.sh"}; – Alan

+0

Enlace muerto ahora :(¿Alguien sabe dónde puedo encontrar un enlace de reemplazo? – Joe

1

Prueba esto:

Runtime.getRuntime().exec("open /folder\\ name/toast.sh"); 

"\" se acaba de poner un espacio en la cadena, pero "\" va a poner un "\" en la cadena, que se pasa a la consola, y el la concha escapará del espacio.

Si eso no funciona, pase los argumentos como una matriz, un elemento para cada argumento. De esta forma, el caparazón no se involucra y no necesitas escapes extraños.

Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"}); 
+0

Uy, eso fue un error de mi parte, he tratado y esto no funciona. – Alan

0

opción de Pablo funciona, pero todavía debe escapar de los espacios como por lo que:

Runtime.getRuntime().exec(new String[]{"open", "/folder\\ name/toast.sh"}); 

lo que succiona sobre el uso de una matriz de cadenas es que cada parámetro y su opción deben estar en su propio elemento. Por ejemplo no se puede hacer esto:

Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"}); 

sino que debe especificarlo así:

Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});