Пробелы в java execute path для 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 /folderu0020name/toast.sh");
Идеи?
Edit: экранированная обратная косая черта... все еще без работы.
3 ответов:
Есть краткое изложение этой проблемы на форумах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"});Самое хреновое в использовании строкового массива - это то, что каждый парам и его опция должны быть в своем собственном элементе. Например, вы не можете сделать это:
Runtime.getRuntime().exec(new String[]{"executable", "-r -x 1", "/folder\\ name/somefile"});Но вместо этого необходимо указать его следующим образом:
Runtime.getRuntime().exec(new String[]{"executable", "-r", "-x", "1", "/folder\\ name/somefile"});
Comments