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

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

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

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

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

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

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
    • Восстановить последнее сохраненное состояние курсора.

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

  • Интерфейс Curses имеет пробелы под экраном GNU и ssh
  • Обнаружение shift + keyup / down в терминале
  • ncurses based menus
  • Ncurses не корректно отображает границу окна в gnome-terminal
  • Издевательство над псевдонимом (оч)
  • Не удается получить Qemu через SSH
  • Ncurses over ssh - будут ли они отображаться?
  • Не удается найти местоположение libncurses.so при запуске файла
  • Как уменьшить размер terminfo ncurses
  • Терминал Linux пропускает некоторые (повторяющиеся / пробельные) символы
  • Попробуйте установить lib32-ncurses-compat-libs 6.04 на Antegros
  • Сравнение текущей базы данных terminfo с исходным файлом terminfo
  • Interesting Posts

    dotfiles: can / should (?) gnu stow сделать жесткие ссылки, поэтому я все еще могу использовать xfce settings gui programs

    Можно ли выполнить команду (запустить многократно)? как можно было бы следовать файлу с помощью tail -f?

    Установка U-Boot и armhf

    Как сделать обновление svn без пароля на crontab

    Возможная прошивка

    Сообщается о чрезмерно высоком использовании памяти (3 ГБ) после перезагрузки

    modinfo, когда модуль был скомпилирован в ядро ​​статически, не работал – обходные пути?

    Могу ли я изменить свою установку ChrUbuntu на Arch Linux на Chromebook от Samsung XE500C21?

    Заменить второе появление между двоеточием и скобкой

    Невозможно изменить разрешение до 1680×1050

    Sudo – поиск DNS (tcpdump)

    Разрешение отклонено, когда я попытался создать папку в корне

    RJ-45 <-> RS-232, могу ли я заменить RS-232 и использовать свой порт Ethernet в качестве COM-порта?

    Обнаружение мягких ссылок

    Сохранение и восстановление полного образа диска

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