Терминал ANSI на самом деле не требуется, чтобы вы могли рассказать вам, что находится на экране. Вы должны помнить об этом сами, если вам нужна информация. Популярная библиотека ncurses
делает это, например, хотя она только позволяет экспортировать экран в файл, а файлформат не документирован. В любом случае bash
не использует ncurses
, поэтому он ничего не знает о состоянии консоли.
Скорее всего, экран, о котором вы говорите, на самом деле является артефактом какой-либо программы эмуляции терминала, например, xterm
. Эти программы запускаются в пользовательском пространстве и редко (если вообще когда-либо) имеют внешний интерфейс запросов. Однако у linux есть консоль (на самом деле, несколько эмулированных консолей, но с использованием консольного режима дисплея), и она поддерживает память дисплея для этих консолей. Кроме того, он предоставляет интерфейс для чтения консольной памяти, обычно доступный как /dev/vcsN
(для значений N
между 0 и количеством виртуальных консолей Linux был скомпилирован). /dev/vcs0
- это «текущая» консоль (та, которая видна).
Большинство дистрибутивов Linux ограничивают доступ к /dev/vcsN
, поэтому, если вы хотите поиграть с ними, вам понадобятся специальные привилегии или вам понадобятся права root для изменения прав доступа к файлам устройств. (Ubuntu появляется, чтобы обеспечить rw
доступ к пользователям в группе tty
;. Проверить ls -l /dev/vcs0
, чтобы увидеть, как ваша система делает это) (И, конечно, вам нужно найти консоль :-) Попробуйте CtlAlt ; CtlAlt , вероятно, даст вам обратно свой графический интерфейс.)
После того, как вы работали вопросы доступа, вы могли бы сделать что-то вроде cp /dev/vcs0 console_memory
, чтобы взглянуть на него. Вы обнаружите, что это всего лишь 2D-массив символов без новых строк и никаких указаний относительно размеров. (Вы можете получить размеры со ioctl
или путем поиска в переменных окружения $LINES
и $COLUMNS
.)
Вы можете использовать /dev/vcsa0
вместо; он имеет немного другой формат, используя два байта на символ, чтобы хранить атрибуты отображения (главным образом, цвета переднего плана и фона, в основном), а также символ. Кроме того, первые четыре байта /dev/vcsaN
- это размеры экрана и позиция курсора (один байт на координату), что избавит вас от работы с запросом на позицию курсора.
Обратите внимание, что консоль не поддерживает полный набор символов Юникода. Фактически, он может отображать только 512 разных глифов одновременно. Чтобы максимизировать доступное пространство глифов, Linux может переназначить некоторые коды на нужные символы, и это сопоставление не является частью памяти консоли.Таким образом, код, извлеченный из памяти консоли, может не иметь явного сопоставления с кодом Юникода, но он должен отлично работать для стандартных символов ANSI.
Благодарим за помощь. Я стараюсь избегать ncurses всеми способами, и если мне нужно отслеживать экран, тогда у меня будет скрипт, заполняющий массив, когда есть запись на экран. Меня просто беспокоило об этом, что вызвало дополнительные накладные расходы. Я попробую сейчас. Я работаю с терминалами psuedo, такими как/dev/pts/1 на Centos, поэтому, надеюсь, это сработает с этим. Я действительно надеялся, что есть escape-последовательность, которая может быть отправлена в терминальную программу, которая вернет содержимое текста в позицию курсора, подобную escape-последовательности в моем вопросе. – Jeff82