9

在 OS X 上,我正在尝试 .exec 某些东西,但是当路径包含空格时,它不起作用。我试过用引号包围路径,转义空间,甚至使用\u0020。

例如,这有效:

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

但如果有空间,这些都不起作用:

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");

想法?

编辑:转义的反斜杠......仍然没有工作。

4

4 回答 4

13

在Sun 的论坛上有一个关于这个问题的总结......似乎是一个非常普遍的问题,不仅限于 OS X。

线程中的最后一篇文章总结了建议的解决方案。本质上,使用Runtime.exec采用String[]数组的形式:

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

或(论坛建议这也可以)

String[] args = new String[] { "open", "folder name/toast.sh" };
于 2009-03-30T15:22:47.917 回答
1

试试这个:

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

“\”只会在字符串中放一个空格,但“\”会在字符串中放一个“\”,它将传递给shell,shell会转义空格。

如果这不起作用,请将参数作为数组传递,每个参数一个元素。这样壳就不会参与进来,你也不需要奇怪的逃跑。

Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"});
于 2009-03-30T15:13:18.610 回答
0

Paul 的选项有效,但您仍然必须像这样逃避空格:

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

使用 String 数组的糟糕之处在于每个参数及其选项必须在它们自己的元素中。例如,您不能这样做:

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

但必须像这样指定它:

Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});
于 2009-12-07T20:18:13.463 回答
0

在 Kotlin 中,我能够使用模板字符串转义空格。

private const val chromeExec = "/Applications/Google 
Chrome.app/Contents/MacOS/Google Chrome"
Runtime.getRuntime().exec(arrayOf("$browserExec", url))

于 2022-01-16T00:15:51.150 回答