Реализация эмулятора терминала - проблемы с повторным вводом - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь реализовать эмулятор терминала в Java.Предполагается, что он сможет разместить и cmd.exe в Windows, и bash в Unix-подобных системах (я хотел бы поддерживать по крайней мере Linux и Mac OS X).У меня проблема в том, что и cmd.exe, и bash повторяют на своем стандартном выходе все, что я посылаю на их стандартный ввод.

Например, в bash я набираю "ls", нажимаю вводв этот момент эмулятор терминала отправляет входную строку в stash bash и очищает поток.Затем процесс снова выводит строку ввода "ls\n", а затем вывод команды ls.

Это проблема, поскольку другие программы, кроме bash и cmd.exe, несделай это.Если я запускаю внутри bash или cmd.exe команду "python -i", интерактивная оболочка python не повторяет ввод, как bash и cmd.exe.Это означает, что обходной путь должен знать, из какого процесса получен фактический результат.Я сомневаюсь, что именно так работают эмуляторы терминала.

Запуск "bash -i" не меняет этого поведения.Насколько я знаю, cmd.exe не имеет различных "интерактивных" и "неинтерактивных" режимов.


РЕДАКТИРОВАТЬ: Я создаю хост-процесс с использованием ProcessBuilder учебный класс.Я читаю stdout и stderr и пишу в stdin процесса, используя технику, похожую на stream gobbler .Я не устанавливаю переменные окружения перед тем, как запустить хост-процесс.Точные команды, которые я использую для запуска процессов: bash -i для bash и cmd для cmd.exe.Я постараюсь опубликовать пример минимального кода, как только мне удастся его создать.

1 Ответ

4 голосов
/ 13 января 2012

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...