Gli spazi in java eseguire percorso per OS X
Domanda
Su OS X, sto cercando di .exec qualcosa, ma quando un percorso contiene uno spazio, non funziona. Ho provato che circonda il percorso con le citazioni, sfuggendo lo spazio, e anche utilizzando \ u0020.
Ad esempio, questo funziona:
Runtime.getRuntime().exec("open /foldername/toast.sh");
Ma se c'è uno spazio, nessuno di questi lavori:
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");
idee?
Modifica:. Fuggito backslash ... ancora worky
Soluzione
C'è una sintesi di questo problema su forum di Sun ... sembra essere un problema piuttosto comune, non limitato a OS X.
L'ultimo post nel thread riassume la soluzione proposta. In sostanza, usa il modulo di Runtime.exec
che prende una matrice String[]
:
String[] args = new String[] { "open", "\"/folder name/toast.sh\"" };
o (il forum suggerisce che questo funzionerà ugualmente)
String[] args = new String[] { "open", "folder name/toast.sh" };
Altri suggerimenti
Prova questo:
Runtime.getRuntime().exec("open /folder\\ name/toast.sh");
"\" sarà solo inserire uno spazio nella stringa, ma "\" metterà un "\" nella stringa, che sarà passato alla shell, e la shell sfuggirà lo spazio.
Se questo non funziona, passare gli argomenti come una matrice, un elemento per ogni argomento. In questo modo la shell non essere coinvolti e non hai bisogno di fughe bizzarre.
Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"});
opzione di Paul funziona, ma è comunque necessario sfuggire gli spazi in questo modo:
Runtime.getRuntime().exec(new String[]{"open", "/folder\\ name/toast.sh"});
La cosa che fa schifo sull'utilizzo di un array di stringhe è che ogni param e la sua opzione devono essere nel loro proprio elemento. Per esempio, non si può fare questo:
Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"});
Ma invece deve specificare in questo modo:
Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});