Java выполняет команду с пробелом в пути - PullRequest
17 голосов
/ 07 февраля 2011

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

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

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

Ответы [ 4 ]

26 голосов
/ 07 февраля 2011

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

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

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

См. Также g ++: файл не найден

Илииспользуйте ProcessBuilder примерно так:

ProcessBuilder pb = new ProcessBuilder("ln", "-s", "dir1/dir2", "my dir/dir2");
Process p = pb.start();
7 голосов
/ 07 февраля 2011

Вам действительно нужно выполнить его в оболочке (например, нужно ли вам расширять оболочку таких вещей, как ~ или * и т. Д.)?Если нет, вы можете вызвать 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\""});

Редактировать:

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

1 голос
/ 26 марта 2012

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

Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","/path/to/file/space*init"});
0 голосов
/ 28 июля 2015

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...