Пробелы в пути выполнения Java для OS X - PullRequest
9 голосов
/ 30 марта 2009

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

Идеи

Редактировать: Побег с обратной косой чертой ... все еще не работает.

Ответы [ 3 ]

12 голосов
/ 30 марта 2009

Сводка этой проблемы на форумах Sun ... кажется довольно распространенной проблемой, не ограниченной только OS X.

Последний пост в теме обобщает предлагаемое решение. По сути, используйте форму Runtime.exec, которая принимает массив String[]:

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

или (форум предполагает, что это тоже будет работать)

String[] args = new String[] { "open", "folder name/toast.sh" };
1 голос
/ 30 марта 2009

Попробуйте это:

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

"\" просто вставит пробел в строку, но "\" поместит "\" в строку, которая будет передана оболочке, и оболочка выйдет из пробела.

Если это не сработает, передайте аргументы как массив, по одному элементу для каждого аргумента. Таким образом, оболочка не вмешивается, и вам не нужны странные побеги.

Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"});
0 голосов
/ 07 декабря 2009

Опция Пола работает, но вы все равно должны избегать пробелов, как это:

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