Я пытаюсь реализовать эмулятор терминала в Java. Предполагается, что он сможет размещать как cmd.exe в Windows, так и bash на Unix-подобных системах (я хотел бы поддержать хотя бы Linux и Mac OS X). Проблема заключается в том, что и cmd.exe
, и bash
повторяют свой стандартный вывод независимо от того, что я отправляю на их стандартный ввод.Реализация эмулятора терминала - проблемы с повторным вводом
Например, в bash я набираю «ls
», нажимаем enter, после чего терминал-эмулятор отправляет входную строку в stdin bash и сбрасывает поток. Затем этот процесс выводит строку ввода «ls\n
», а затем вывод команды ls
.
Это проблема, потому что другие программы, кроме bash
и cmd.exe
, не делают этого. Если я запустил, либо в bash, либо в cmd.exe
, команда «python -i
», интерактивная оболочка python не повторяет ввод так, как это делают bash
и cmd.exe
. Это означает, что обходной путь должен был бы знать, из какого процесса пришел фактический результат. Я сомневаюсь, что это то, что делают настоящие терминальные эмуляторы.
Выполнение «bash -i
» не меняет это поведение. Насколько я знаю, cmd.exe
не имеет различных «интерактивных» и «неинтерактивных» режимов.
EDIT: Я создаю хост-процесс с использованием ProcessBuilder
класса. Я читаю stdout и stderr и записываю на stdin процесса, используя технику, похожую на stream gobbler. Я не устанавливаю никаких переменных среды перед тем, как начать процесс хоста. Точные команды, которые я использую для запуска процессов, - bash -i
для bash и cmd
для cmd.exe. Я попытаюсь опубликовать минимальный пример кода, как только мне удастся его создать.
Это похоже на 'bash': скрыть пользовательский ввод. http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/ Не уверен, насколько портативен это. – Piskvor
Это смешно, 'echo ls | bash' не делают ничего подобного. –
Действительно, это не так, даже если я запускаю это внутри эмулятора терминала. Я предполагаю, что это имеет какое-то отношение к bash, зная, что вход поступает из трубы. – Honza