Я хотел бы иметь возможность запускать VI из моей программы Java и дождаться, когда пользователь покинет VI перед продолжением. Вот фрагмент кода, который я в настоящее время:Как я могу запустить VI из Java под commons-exec?
...
String previewFileName="test.txt"; // the file to edit
CommandLine cmdLine = new CommandLine("/usr/bin/vi");
cmdLine.addArgument(previewFileName);
cmdLine.addArgument(">/dev/tty");
cmdLine.addArgument("</dev/tty");
Executor executor = new DefaultExecutor();
try
{
DefaultExecuteResultHandler resultHandler = new ResetProcessResultHandler(cmdLine);
executor.execute(cmdLine, resultHandler);
} catch (IOException e)
{
throw new Error("Cannot execute command: /usr/bin/vi " + previewFileName, e);
}
log.info("waiting...");
cmdLine.wait();
log.info("...done");
...
private class ResetProcessResultHandler extends DefaultExecuteResultHandler
{
private final CommandLine mCommandLine;
public ResetProcessResultHandler(CommandLine pCommandLine)
{
mCommandLine = pCommandLine;
}
public void onProcessComplete(int exitValue)
{
log.info("Command complete rc(" + exitValue + ")");
if (exitValue != 0)
{
throw new RuntimeException("VI command error [rc=" + exitValue + "] ");
}
mCommandLine.notify();
}
public void onProcessFailed(ExecuteException e)
{
if (e.getExitValue() != 0)
{
log.error("launch VI error " + e.toString());
throw new RuntimeException("VI command failed [" + e.getCause() + "] ");
}
else
{
log.info("VI complete rc(" + e.getExitValue() + ")");
}
mCommandLine.notify();
}
}
Я получаю выход:
Vim: output is not to a terminal
Vim: input is not from a terminal
Но потом я вижу экран окрашен, как если бы начался VI; и VI не читает символы, которые я печатаю.
Итак ... перенаправление с/dev/tty не делает трюк.
Кто-то, должно быть, сделал это раньше - помогите!
Спасибо,
Все
Это не сработает, потому что vi не выведен на передний план и прикреплен к tty пользователя (что, очевидно, действительно задает вопрос). –