Какой тип терминала я использую?

51

Я проверил это как с Ubuntu 12.04, так и с Debian 7. Когда я это делаю

echo $TERM

я получил

xterm

Но если я использую выпадающее меню «помощь»> «о», то оно говорит gnome terminal 3.4.1.1.

Значит ли это, что я использую только gnome-терминал? Или просто xterm? Или gnome-терминал является расширением xterm? Я не совсем понимаю.

mulllhausen
источник

Ответы:

49

Для чего $TERM?

$TERMПеременная предназначена для использования в приложениях , чтобы воспользоваться возможностями этого терминала.

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

Это работает так, что система хранит библиотеку известных терминалов и их возможностей. На большинстве систем он есть /usr/share/terminfo(есть также termcap, но он больше не используется).

Допустим, у вас есть программа, которая хочет отображать красный текст. По сути, он вызывает библиотеку terminfo, которая говорит: « дайте мне последовательность байтов, которую я должен отправить для красного текста для терминала xterm ». Затем он просто берет эти байты и печатает их.
Вы можете попробовать это самостоятельно tput setf 4; echo hi. Это получит setfвозможность terminfo и передаст ему параметр 4, какого цвета вы хотите.


Почему гном терминал лжет о себе

Теперь предположим, что у вас есть новый блестящий эмулятор терминала, который был только что выпущен, а системная библиотека terminfo пока не имеет его определения. Когда ваше приложение отправляется посмотреть, как что-то сделать, оно не будет работать, потому что терминал не известен.

Ваш терминал обходит это, лгая о том, кто он. Итак, ваш терминал гномов говорит " Я xterm ".

Xterm - это очень простой терминал, который существует с начала X11, и поэтому большинство эмуляторов терминала поддерживают то, что он поддерживает. Таким образом, благодаря терминалу gnome, который говорит, что это xterm, более вероятно, что у него есть определение в библиотеке terminfo.

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

Если вы хотите переопределить это, многие терминалы предложат какой-либо способ настройки поведения. Но вы также можете просто сделать export TERM=gnome-terminal.

Патрик
источник
4
Рекомендовать кому-то экспортировать $ TERM действительно похоже на втирание соли в открытую рану ...
jasonwryan
1
да уж. я предполагаю , что разработчики гном-терминала левого $TERMнабора к xtermпо уважительной причине
mulllhausen
4
@mulllhausen Эта причина хорошо объяснена в моем ответе ...
Патрик
27

TERMПеременная среды указывает терминала типа , а не терминал приложения . TERMимеет конкретную цель: он сообщает приложениям, работающим в этом терминале, как взаимодействовать с терминалом.

Приложения взаимодействуют с терминалами путем написания escape-последовательностей - последовательностей символов, которые включают непечатаемые символы и имеют такие эффекты, как перемещение курсора, стирание части экрана, изменение текущего цвета и т. Д. В старые времена физические терминалы разных марок имели разные наборы escape-последовательностей. Поэтому операционная система поддерживает базу данных типов терминалов и их характеристик. Традиционная база данных - termcap («ТЕРМИНАЛЬНЫЕ ВОЗМОЖНОСТИ»); многие современные системы и приложения перешли на terminfo . Обе базы данных индексируются по имени типа терминала, и приложения запрашивают их, используя имя типа терминала из TERMпеременных среды.

В настоящее время большинство терминалов используют стандартный набор escape-последовательностей с несколькими общими наборами расширений, поэтому вы не увидите много разных значений TERM. Большинство эмуляторов GUI-терминала совместимы с xterm , традиционным X-терминалом (который до сих пор используется и поддерживается).

Эмуляторы терминалов, которые отличаются от xterm, могут добавлять свои собственные записи в базу данных терминалов под своим именем. Однако это плохо сочетается с удаленными оболочками. Программа, работающая на машине A, но отображающаяся на машине B, например, потому что она была запущена через ssh из B в A, должна запросить базу данных терминала на машине A. Методы удаленного входа, такие как ssh, переносят TERMпеременную среды, но это полезно только тогда, когда в базе данных терминалов B также есть запись для значения пользователя на A. Поэтому многие эмуляторы терминалов придерживаются того, TERM=xtermчто довольно широко известно.

Различие между терминалами по большому счету не в том, как приложения взаимодействуют с ними, а в том, как терминалы взаимодействуют с пользователем и соответствуют его среде. Например, Gnome Terminal хорошо выглядит на Gnome и предоставляет вкладки и другие тонкости; Konsole хорошо выглядит на KDE и предоставляет вкладки и другие тонкости; urxvt имеет небольшое требование к памяти; Console2 работает в Windows; screen и tmux предоставляют сеансы, которые могут быть подключены к разным родительским терминалам; и так далее. Поскольку ни одна из этих функций не имеет значения для приложений, работающих в терминале, большинство эмуляторов терминала используют TERM=xterm.

Чтобы узнать, на каком терминале работает оболочка, посмотрите на родительский элемент оболочки:

ps -p$PPID
Жиль "ТАК - перестань быть злым"
источник
Запуск, ps -p$PPIDкажется, не говорит мне, на каком терминале я работаю. Или, по крайней мере, не так, как я понимаю. У вас есть пример вывода / ответа?
user3731622
@user Выходные данные представляют собой набор чисел и загадочных сокращений, за которыми следует командная строка. В большинстве случаев именно в командной строке запускается эмулятор терминала, в котором работает оболочка.
Жиль "ТАК - перестань быть злым"
12

Переменная окружения TERM не означает используемый вами терминал.

Цитирую gnu.org :

Переменная окружения TERM содержит идентификатор возможностей текстового окна. Вы можете получить подробный список этих возможностей, используя команду> 'infocmp', используя 'man 5 terminfo' в качестве ссылки.

При создании текста со встроенными цветовыми директивами msgcat просматривает переменную TERM. Текстовые окна сегодня обычно поддерживают не менее 8 цветов. Однако часто текстовое окно поддерживает 16 или более цветов, даже если для переменной TERM задан идентификатор, обозначающий только 8 поддерживаемых цветов. Может быть целесообразно установить для переменной TERM другое значение в следующих случаях:

xterm в большинстве случаев построен с поддержкой 16 цветов. Он также может быть построен с поддержкой 88 или 256 цветов (но не оба). Вы можете попробовать установить TERM на xterm-16color, xterm-88color или xterm-256color. rxvt

rxvt часто создается с поддержкой 16 цветов. Вы можете попробовать установить TERM в rxvt-16color. Konsole

Консоль также часто создается с поддержкой 16 цветов. Вы можете попробовать установить TERM в konsole-16color или xterm-16color.

После установки TERM вы можете проверить это, вызвав msgcat --color = test и увидев, выглядит ли вывод как приемлемая цветовая карта. Переменная окружения TERM содержит идентификатор возможностей текстового окна. Вы можете получить подробный список этих возможностей, используя команду 'infocmp', используя 'man 5 terminfo' в качестве ссылки.

mavillan
источник