Как я могу открыть другое приложение командной строки в Linux из Java-программы?

1

Я пытаюсь написать небольшое приложение командной строки Java, которое создаст новый файл, а затем откройте его с помощью редактора по умолчанию для систем, хранящегося в $ EDITOR, а затем выйдите после закрытия редактора.

Пока, без везения, я пробовал следующее:

Desktop dt = Desktop.getDesktop();
dt.edit(file);

Этот метод привел к UnsupportedOperationException, который имеет смысл, поскольку я запускаю свою программу с терминала, а не как приложение Java с рабочего стола.

Прямо сейчас у меня есть это:

Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(commandString); // "vim newfile"
proc.waitFor();

Это работает, но не так, как мне нужно. Когда я бегу

ps a | grep vim

Я вижу, что он действительно работает в фоновом режиме, с именем файла, которое я ему дал:

1000 pts/1    S+     0:00 vim 2014-07-16.23-02

Любые идеи о том, как сделать этот запуск на переднем плане?

Теги:
command-line-interface

1 ответ

1
Лучший ответ

vim, как и многие интерактивные программы, ожидает, что его stdin станет реальным терминалом, на который он может отправлять вызовы ioctl. Но при выполнении через Runtime.exec() stdin будет перенаправлен на родительский процесс (см. Javadoc on Process для получения дополнительной информации).

В Java 7 вы должны иметь возможность использовать ProcessBuilder.inheritIO() для передачи по файлам. (Отказ от ответственности: я не пробовал, YMMV.)

  • 0
    Я надеялся найти решение Java 6, но похоже, что Java 7 необходим для этой работы.
  • 1
    @grimetime: если вы застряли на Java 6, вы всегда можете использовать JNI для выполнения fork() в нативном коде. Конечно, тогда вам приходится сталкиваться с болью, связанной с зависимостью JNI от платформы.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню