Почему я не могу отправлять escape-последовательности с клавиатуры, но могу сделать это из другого tty?

Я пытаюсь понять, как работает терминал, делая разные трюки, например, писать с одного tty на другой, меняя настройки tty1 с tty2 и т. Д. Кроме того, я пробую этот материал – с помощью клавиатуры измените цвет с помощью escape-последовательности. То есть, не через echo -e '\e[0;31m' , а путем ввода с клавиатуры. Это не работает.

Я делаю следующие шаги:

  1. Открыть tty1 и tty2
  2. В tty2 положите bash в режим сна, на sleep 10m . sleep 10m . Ввод слова «один».

введите описание изображения здесь

  1. Перейдите к tty1 do echo -n ^[[0;31m > /dev/tty2 , Первый символ ^[ получите этот путь Ctrl + v Esc
  2. Вернитесь к tty2 , набрав слово «два». Да – цвет был изменен на красный, с другого tty.

введите описание изображения здесь

  1. Повторите шаги 3,4, но с зеленым цветом и словом «три»

введите описание изображения здесь

  1. И, наконец, попробуйте отправить escape-последовательность непосредственно с клавиатуры, а не на другую tty , набрав ^[[0;37m в tty2 . Я делаю все одинаково – Esc ( Ctrl + v не требуется, потому что readline спит), затем [0;37m , но получите следующее:

введите описание изображения здесь

Вопрос: Почему это работает так? Все символы одинаковые, состояние терминала такое же, но в одном случае терминал получает escape-последовательность, а в другом случае нет.

One Solution collect form web for “Почему я не могу отправлять escape-последовательности с клавиатуры, но могу сделать это из другого tty?”

Когда вы запускаете echo , вы отправляете вывод на терминал. Терминал интерпретирует escape-последовательности, такие как тот, который меняет цвета на выходе, который отправляется на него. Эти escape-последовательности предназначены для отправки приложениями, поэтому они распознаются на выходе, поступающем от приложения, запущенного в терминале. Обычно приложение, запущенное на терминале, является тем, которое запускается эмулятором терминала (вашей оболочкой), и теми, которые запускаются по очереди, но если вы запустите echo … >/dev/tty2 то echo эффективно «работает в терминале» ( в том смысле, что его выход идет на терминал, что важно здесь).

Когда вы нажимаете Esc [ и т. Д., Вы отправляете ввод на терминал. Терминал не интерпретирует escape-последовательности, такие как тот, который меняет цвета на вход, который он получает. Терминал интерпретирует escape-последовательности во входном сигнале, но для совершенно другой цели: это способ кодирования нажатий функциональных клавиш.

Как работают ввод с клавиатуры и вывод текста? имеет некоторые соответствующие предпосылки.

  • Почему атрибуты терминала отличаются друг от друга?
  • Отправка сообщения от одного пользователя терминала другому пользователю
  • Установка свежей арки - текст терминала полностью нечитабелен сразу после загрузки
  • Вперед stdout к различным tty
  • Как запустить tty из командной строки?
  • Почему `last` show '{' и '|' в поле TTY?
  • Как получить штыри-проклятия, чтобы начать с правильного tty?
  • Как использовать agetty из командной строки
  • Эффект `stty --file = <terminal> <flag>` является временным только для консолей в bash. Зачем?
  • Что должны делать интерактивные оболочки в сиротских группах процессов?
  • Инструмент для просмотра других tty для linux?
  • Linux и Unix - лучшая ОС в мире.