Java Runtime exec() не работает

Я пытаюсь выполнить команду оболочки через java вот так

if (Program.isPlatformLinux())
{
    exec = "/bin/bash -c xdg-open \"" + file.getAbsolutePath() + "\"";
    exec2 = "xdg-open \"" + file.getAbsolutePath() + "\"";
    System.out.println(exec);
}
else
{
    //other code
}
Runtime.getRuntime().exec(exec);
Runtime.getRuntime().exec(exec2);

но вообще ничего не происходит. Когда я выполняю этот код, он печатает /bin/bash -c xdg-open "/home/user/Desktop/file.txt" в консоли, но не открывает файл. Я также пытался сначала вызвать bash, а затем команду xdg-open, но изменений нет.

В чем здесь проблема и как я могу это решить?

РЕДАКТИРОВАТЬ: вывод вызова выглядит следующим образом:

xdg-open "/home/user/Desktop/files/einf in a- und b/allg fil/ref.txt" xdg-open: неожиданный аргумент "in"

Но мне это кажется очень странным - почему команда стоит отдельно перед in, даже если весь путь указан в кавычках?


person zimmerrol    schedule 12.11.2016    source источник
comment
Попробуйте проверить, есть ли ошибка, распечатав вывод процесса, как показано в этом вопросе. Возможно, вы получите более конкретную ошибку для работы.   -  person BackSlash    schedule 13.11.2016
comment
@BackSlash Я последовал вашему совету и добавил результаты этого в свой исходный пост.   -  person zimmerrol    schedule 13.11.2016
comment
einf in a- und b это имя папки, содержащее пробелы?   -  person Timothy Truckle    schedule 13.11.2016
comment
См. этот вопрос, почему Runtime.exec(String) терпит неудачу, когда команда содержит кавычки.   -  person that other guy    schedule 13.11.2016


Ответы (1)


Обратите внимание, что для этого не требуется xdg-open. Вы можете использовать независимый от платформы Java Desktop API:

if(Desktop.isDesktopSupported()) {
    Desktop.open("/path/to/file.txt");
}

Обновить

Если стандартный подход по-прежнему вызывает проблемы, вы можете передать параметры в виде массива, поскольку Runtime.exec не вызывает оболочку и, следовательно, не поддерживает и не разрешает заключать в кавычки или экранировать:

String program;
if (Program.isPlatformLinux())
{
    program = "xdg-open";
} else {
    program = "something else";
}

Runtime.getRuntime().exec(new String[]{program, file.getAbsolutePath()});
person BackSlash    schedule 13.11.2016
comment
Это был мой первый подход. Но это не работает: xdg-open/home/user/Desktop/files/einf\ in\ a-\ und\ b/allg\ fil/ref.txt xdg-open: unexpected argument 'in\' - person zimmerrol; 13.11.2016
comment
Вам нужно избежать обратной косой черты. Проверьте ответ еще раз - person BackSlash; 13.11.2016
comment
Я не могу использовать класс Desktop, поскольку на некоторых устройствах он приводит к сбою всего приложения (см. stackoverflow.com/questions/40554515/) - person zimmerrol; 13.11.2016
comment
Ваш код также не работает с той же ошибкой, что и выше. - person zimmerrol; 13.11.2016
comment
Хорошо, кажется, это работает. Итак, у вас есть идея, как решить настоящую проблему, заключающуюся в том, что класс Desktop вызывает сбой приложения на некоторых устройствах? - person zimmerrol; 13.11.2016