Когда Java запускает программу через Runtime.exec()
(и это в конце концов делает commons-exec), она соединяет потоки ввода, вывода и ошибок программы с вашим Java-приложением как потоки ввода-вывода. Такой поток, конечно, не является терминалом, например, вы не можете переместить текстовый курсор в нем (поскольку он не имеет никакого), изменить цвета текста или определить, нажата ли клавиша Shift
(так как это просто поток байтов а не физического кейборада). Таким образом, интерактивное приложение, такое как vi
, не может работать в таких условиях, как в терминале.
Кстати, я не уверен, что введенные вами аргументы командной строки анализируются оболочкой или передаются непосредственно в программу. В последнем случае ваше перенаправление на /dev/tty
может не сработать, даже если бы у Java был способ каким-то образом позволить программе заменить подключенные потоки Java чем-то другим.
Кроме того, кажется странным, почему вы хотите запустить vi
изнутри Java-программы.
Так что я думаю, что лучшее решение - запустить эмулятор терминала, такой как konsole
или gnome-terminal
или xterm
, и позволить ему запустить vi, передав соответствующий аргумент в его командной строке (например, konsole -e vi
). В этом случае должно появиться окно терминала, и vi
может функционировать внутри него. Конечно, это не сработает, если вы работаете на автономном сервере, но тогда запуск vi
не может быть полезен в любом случае.