предотвращение перезапуска вывода терминала с помощью вывода программы

Предположим, что я запускаю такую ​​команду в терминале:

~$ echo 'sleep 2; echo "hello!"' | sh 

затем начните вводить следующую строку. Через две секунды слова «привет! \ N» будут вставлены во все, что я пишу. Я знаю, что есть обходное решение для этого (нажатие вниз, которое обновляет подсказку), однако на других системах, которые не имеют истории, например, используя MUD через telnet, это невозможно.

Кто-нибудь знает о приложении ncurses или эмуляторе терминала, который отделяет stdin от stdout? Это выглядит довольно легко сделать в ncurses, вам просто нужно использовать некоторые умные dup2, но прежде чем я это сделаю, я хочу знать, сделал ли кто-нибудь это раньше.

Любые другие решения основной проблемы также приветствуются.

  • Файлы библиотеки не найдены, хотя они указаны в файле ldconfig
  • attron (A_BLINK), используя Ncurses, ничего не делает
  • Визуализатор файла журнала в терминале (UNIX) (повтор записи в журнале)
  • Интерфейс Curses имеет пробелы под экраном GNU и ssh
  • Как изменить цвет фона приложений curses?
  • Преобразование html-таблицы в ncurses-подобную таблицу ascii?
  • tmux: приложения ncurses отображаются неправильно (с мусором и т. д.)
  • Suse 11 против Suse 10 разницы, влияющие на цвета терминала?
  • 2 Solutions collect form web for “предотвращение перезапуска вывода терминала с помощью вывода программы”

    Это не так просто, как кажется. Это связано с режимом, приготовленным в режиме «готово» и «сыром», и включено ли эхо или нет.

    Когда терминал находится в режиме готовности (по умолчанию), ядро ​​считывает все, что входит в качестве входных данных, и обрабатывает его с помощью рудиментарных возможностей редактирования строк, которые включают немедленное эхо нормального текста, обработку стирания и уничтожения символов, которые стирают один символ и весь текущей строки соответственно, и несколько других вещей. Строки текста на самом деле отображаются на входе терминала при нажатии кнопки ввода. В течение всего времени, пока вы не нажмете enter, все происходит полностью внутри ядра, и ни один процесс, выполняющийся на терминале, не получает один байт , поэтому приложение переднего плана даже не знает, что пользователь в процессе ввода чего-либо. Процесс, выполняющийся на tty, не может подавить это эхо, даже если он хочет только потому, что эхо придет в неподходящее время (например, смешанное с выходом), потому что такой процесс даже не знает, что происходит вход.

    Вы можете установить терминал в необработанный режим вместо этого без эха, чтобы подавить это ( stty raw или termios), но затем вы полностью потеряете возможности редактирования строк ядра – что означает, например, что вы не можете исправить опечатку, нажав Ctrlu и начать с конца. Что еще более важно, у вас будет много проблем с использованием любой программы, которая зависит от готовой обработки ядра (в основном ничего, что не использует readline или ncurses), потому что вы будете набирать полностью слепые в таких программах! О, а также: без обработки, обработанной терминалом, вы теряете перехват ядра для ярлыков управления заданиями для прерывания и приостановки (по умолчанию Ctrl- c и Ctrl- z соответственно).

    Вы можете включить некоторые экраны ANSI в фоновом echo чтобы отправить его вывод в верхнюю часть экрана:

     printf %b\\n 'sleep 2; printf "\0337\033[H\033[Khello!\0338"' |sh 

    Должно быть, это возможно. Для этого требуется совместимый с ANSI совместимый терминал, но если у вас его нет, вы, вероятно, должны это сделать. Все остальные используют их с 80-х годов.

    В каждом случае ведущий \033 – это восьмеричный escape для символа <ESC>, например, вы можете нажать в левом верхнем углу клавиатуры. Все остальные последовательности интерпретируются терминалом на входе как команды адресации курсора.

    Они делают следующее:

    • 7
      • Сохраните состояние курсора для последующего восстановления.
    • [H
      • Переместите курсор в первый столбец в первой строке на экране.
    • [K
      • Удалите текст в текущей строке.
    • 8
      • Восстановить последнее сохраненное состояние курсора.

    В результате фоновый процесс обращается к курсору в верхнем левом углу экрана, очищает эту строку, записывает привет! , а затем переводит курсор туда, где он его нашел. Возможны более сложные комбинации – и их можно использовать для разработки более надежных решений, но это то, что я получил.

    Linux и Unix - лучшая ОС в мире.