Пробелы в пути выполнения Java для OS X
Вопрос
В 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");
Идеи?
Редактировать:Сбежавшая обратная косая черта...все еще не работает.
Решение
Краткое описание этой проблемы есть на Форумы Sun...Кажется, это довольно распространенная проблема, не ограничивающаяся OS X.
В последнем сообщении ветки кратко изложено предлагаемое решение.По сути, используйте форму Runtime.exec
это требует String[]
множество:
String[] args = new String[] { "open", "\"/folder name/toast.sh\"" };
или (форум предполагает, что это тоже будет работать)
String[] args = new String[] { "open", "folder name/toast.sh" };
Другие советы
Попробуй это:
Runtime.getRuntime().exec("open /folder\\ name/toast.sh");
«\» просто добавит пробел в строку, но «\» добавит в строку «\», которая будет передана в оболочку, и оболочка выйдет из этого пробела.
Если это не сработает, передайте аргументы как массив, по одному элементу для каждого аргумента.Таким образом, оболочка не вмешивается, и вам не нужны странные побеги.
Runtime.getRuntime().exec(new String[]{"open", "/folder name/toast.sh"});
Вариант Пола работает, но вам все равно придется избегать пробелов следующим образом:
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"});