Java выполняет команду с пробелом в пути

Как я могу выполнить команду Java System (shell), которая имеет пробел в пути?

Я пробовал помещать кавычки и обратную косую черту(), но это не работает.

ln -s "dir1/dir2" "my\ dir/dir2"

Ответы

Ответ 1

Самым надежным способом является использование Runtime.exec(String [] cmdarray).

Если вы используете Runtime.exec(команда String), Java только разбивает команду на пробелы.

командная строка разбивается на токены, используя StringTokenizer, созданный вызовом new StringTokenizer (команда) без дальнейшей модификации категорий символов. Токены, созданные токенизатором, затем помещаются в новый массив строк cmdarray в том же порядке.

См. также g++: Файл не найден

Или используйте ProcessBuilder примерно следующее:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();

Ответ 2

Вам действительно нужно выполнить его в оболочке (например, вам нужно расширять оболочку таких вещей, как ~ или * и т.д.)? Если нет, вы можете напрямую вызвать ln:

Process p =
    Runtime.getRuntime()
    .exec(new String[]{"/bin/ln","-s","dir1/dir2", "my\\ dir/dir2"});

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

Process p =
    Runtime.getRuntime()
    .exec(new String[]{"/bin/sh", "-c", "ln -s \"dir1/dir2\" \"my\\ dir/dir2\""});

Edit:

У меня было впечатление, что второй путь имеет буквальную обратную косую черту. Если он не должен удалять \\ из строковых литералов выше.

Ответ 3

Ни одна из этих работ не работает над Львом. Однако следующее работает и обратно совместимо для Tiger.

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});

Ответ 4

Вы можете использовать его следующим образом, не вводя никаких обратных косых черт:   Runtime.getRuntime().exec(new String[]{"ln", "-s", "dir1/dir2", "my dir/dir2"});