Как и где интерпретируется $ TERM?

9

Мне интересно, как внутренне работает какая-то терминальная магия .

Во время игры с контейнерами Docker переменная окружения $TERMне была установлена. Это привело к странно выглядящим консольным приложениям, таким как vim и tmux, но также к игнорированию CTRL + l (очистка экрана).

Я уверен, что все функции, такие как частичное обновление экрана, цвета, команды, такие как сброс экрана и т. Д., Реализованы с использованием escape-кодов, верно?

Так, где эта переменная интерпретируется и позволяет, например, сбросить экран моего терминала, используя CTRL + l, если я установлю правильное значение там? Например, кто проверяет, какие цвета поддерживаются (xterm vs xterm-256color)? Оболочка? Приложение или библиотека типа ncurses? И где определены возможные значения / типы терминалов?

муфель-
источник

Ответы:

8

$TERMчитается и интерпретируется системой terminfo. terminfo также относится к базе данных описаний терминалов, которую вы можете найти в большинстве систем /usr/share/terminfo. $TERMдолжен соответствовать одной из записей в этой базе данных. Была также старая библиотека под названием termcap, у которой было меньше возможностей, но terminfo заменил ее. В современных системах terminfo является частью библиотеки ncurses.

Приложения обычно либо извлекают возможности терминала напрямую, используя библиотечные функции, например, tigetstr()либо используют интерфейсы curses более высокого уровня для управления макетом экрана. В любом случае, $TERMи база данных terminfo будет использоваться.

Celada
источник
5

TERMПеременная интерпретируется каждым приложением, с помощью системных библиотек. Его значение - это имя, которое ищется в базе данных. В зависимости от разновидности Unix и его возраста, база данных может быть как termcap (традиционная, в наше время мало используемая), так и terminfo (современная, поскольку она подразумевала усовершенствование termcap и используемая в настоящее время большинством систем).

Базы данных termcap и terminfo связывают имена возможностей со значениями. Возможности - это либо описание того, что может делать терминал (количество строк, возможность подчеркивания и т. Д.), Либо строки, которыми можно обмениваться с терминалом (escape-последовательности для форматирования текста, перемещения курсора и т. Д. И т. Д.). последовательности переключения направления, отправленные функциональными клавишами). Вы можете посмотреть man 5 termcapи man 5 terminfoувидеть, какие возможности известны в вашей системе.

Например, когда вы нажимаете Ctrl+, Lчтобы перерисовать экран, он считывает возможности в базе данных терминала, чтобы узнать, какие escape-последовательности он должен использовать для перемещения курсора. Если TERMон не установлен или установлен неправильно, экран не может знать, как перемещать курсор.

Вы можете использовать tputкоманду для получения записей в базе данных terminfo. Например, tput linesраспечатывает количество строк на терминале. tput clearочищает экран (потому что его вывод печатается на терминале); чтобы увидеть, какова соответствующая escape-последовательность, распечатайте ее в читаемой форме, например tput clear | cat -v.

Количество цветов имеет довольно большую историю, что делает его неэффективным по праву: эмуляторы терминалов, как правило, занижают количество цветов, чтобы не нарушить некоторые приложения. Посмотрите поддержку tmux, TERM и 256 цветов, чтобы узнать больше об этом, особенно в контексте tmux. Разница между xterm-256colorsи xtermзаключается в том, что первый сообщает о 256 цветах в terminfo, а второй - о традиционных 8.

Жиль "ТАК - перестань быть злым"
источник
2

TERM, условно относится к описанию терминала. Первоначально он назывался разделом текстового файла termcap (начиная с конца 1970-х годов). В середине 1980-х terminfo был представлен как скомпилированный (двоичный) файл, который экономил время при получении описания терминала. Хотя оба доступны для всех Unix-подобных платформ, termcap сегодня редко используется, за исключением случаев, когда используется эмуляция terminfo.

Для обоих этих форматов данных приложения обычно извлекают данные из базы данных терминала с помощью повторно используемых библиотек программирования. Библиотека программирования terminfo обычно является частью библиотеки curses более высокого уровня, хотя она может быть предоставлена ​​(например, необязательно, как в ncurses) в виде отдельного библиотечного файла. Независимо от того, предоставляется ли библиотека terminfo отдельно или нет, в этих случаях она считается частью библиотеки curses. (Есть также несколько других высокоуровневых библиотек, таких как сленг).

Запись базы данных терминала для каждого терминала содержит свойства, называемые возможностями . Они сообщают библиотеке curses (или приложениям, использующим напрямую termcap / terminfo), как выполнять полезные операции, такие как очистка экрана. Для большинства терминалов это escape-последовательность. Несколько терминалов могут не поддерживать escape-последовательность для этой цели; Есть и другие возможности, которые могут быть объединены библиотекой curses для очистки экрана (например, очистка каждой строки). Не все возможности являются escape-последовательностями. Есть логические и число возможностей , а также, например, сказать ли поддерживается функция, и как велико - то (например, размер экрана).

Каждое приложение, которое использует termcap / terminfo, использует соответствующую библиотеку для извлечения описания терминала, а также для выполнения таких операций, как подстановка параметров в определенные возможности. Например, большинство терминалов предоставляют возможность перемещать курсор на заданное количество столбцов или строк из его текущего местоположения. Функции tparm(или tiparm) подставляют число в возможность получения фактической escape-последовательности.

Библиотека curses содержит приложения командной строки, которые поддерживают базу данных терминала ( tic , infocmp ) и некоторые из них, которые используются в сценариях оболочки для запросов к базе данных терминала или выполнения низкоуровневых операций с возможностями терминала ( tput , tset / reset ).

Есть нетрадиционные приложения, которые используют TERMбез использования базы данных терминала. Большинство из них просто жестко кодируют свое поведение (например, GNU grep, groff и текстовые веб-браузеры links / links2 / elinks), в то время как у некоторых есть то, что составляет их собственную терминальную базу данных (например, GNU ls), но с использованием других правил и поведение.

Вернуться к вопросу (ам):

  • Так, где эта переменная интерпретируется и позволяет, например, сбросить экран моего терминала, используя CTRL + l, если я установлю правильное значение там?

    Приложение и базовые библиотеки интерпретируют это значение. Для controlLэтого это может быть сделано для bash в библиотеке readline (которая использует интерфейс программирования termcap).

  • Например, кто проверяет, какие цвета поддерживаются (xterm vs xterm-256color)?

    В базе данных терминала хранится количество цветов в качестве возможности, а также возможности установки цветов переднего плана и фона и сброса цветов. Некоторые приложения объединяют эти возможности с другой информацией (такой как утверждение разработчика, которое xterm«действительно» xterm-256color).

  • Оболочка?

    Большинство оболочек используют интерфейс программирования termcap для получения информации о терминале. Тем не менее, они являются приложениями, которые имеют свое собственное поведение (не обязательно такое же, как у curses).

  • Приложение или библиотека типа ncurses?

    (см. выше: оболочки - это особый тип применения)

  • И где определены возможные значения / типы терминалов?

    Обычно это находится в базе данных терминала, используемой приложениями, использующими библиотеки curses или сленга. Некоторые приложения жестко запрограммированы или используют частную базу данных.

Дальнейшее чтение:

Томас Дики
источник