Espacios en Java se ejecutan camino para OS X
Pregunta
En OS X, que estoy tratando de .exec algo, pero cuando una ruta contiene un espacio, no funciona. He intentado que rodea la ruta entre comillas, escapando el espacio, e incluso utilizando \ u0020.
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");
Las ideas?
Editar:. Escapado barra invertida ... todavía no hay worky
Solución
Hay un resumen de este problema en foros de Sun ... parece ser un asunto muy común no se limita a OS X.
El último mensaje en el hilo resume la solución propuesta. En esencia, utilizar la forma de Runtime.exec
que toma un array String[]
:
String[] args = new String[] { "open", "\"/folder name/toast.sh\"" };
o (el foro sugiere que esto funcionará también)
String[] args = new String[] { "open", "folder name/toast.sh" };
Otros consejos
Prueba esto:
Runtime.getRuntime().exec("open /folder\\ name/toast.sh");
"\" se acaba de poner un espacio en la cadena, pero "\" pondrá un "\" en la cadena, que se pasa a la consola, y la cáscara escapará al espacio.
Si eso no funciona, pasaren los argumentos como una matriz, un elemento para cada argumento. De esa manera la cáscara no se involucra y que no es necesario escapa extrañas.
Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"});
opción de Pablo funciona, pero todavía debe escapar de los espacios de esta manera:
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, usted no puede hacer esto:
Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"});
Pero en lugar debe especificar que de esta manera:
Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});