2012-01-13 3 views
1

Я пытаюсь реализовать эмулятор терминала в 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. Я попытаюсь опубликовать минимальный пример кода, как только мне удастся его создать.

+0

Это похоже на 'bash': скрыть пользовательский ввод. http://www.tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script/ Не уверен, насколько портативен это. – Piskvor

+2

Это смешно, 'echo ls | bash' не делают ничего подобного. –

+0

Действительно, это не так, даже если я запускаю это внутри эмулятора терминала. Я предполагаю, что это имеет какое-то отношение к bash, зная, что вход поступает из трубы. – Honza

ответ

4

В Unix запустите stty -echo, чтобы отключить «локальное эхо» (т. Е. Оболочка повторяет все, что вы набираете). Обычно это разрешено, поэтому пользователь может редактировать то, что она набирает.

В вашем случае BASH должен каким-то образом распределить псевдо TTY; в противном случае он не будет отбирать каждую команду. set +x будет иметь аналогичный эффект, но тогда вы увидите + ls вместо ls на выходе.

С cmd.exe команда @ECHO OFF должна достичь такого же эффекта.

Просто выполните их после того, как процесс был создан, и он должен работать.