Я тестировал это как с Ubuntu 12.04, так и с Debian 7. Когда я это делаю
echo $TERM
я получил
xterm
Но если я использую выпадающее меню «Справка» > «О программе», то там написано gnome terminal 3.4.1.1
.
Означает ли это, что я использую только gnome-terminal? Или только xterm? Или gnome-terminal — это расширение xterm? Я в замешательстве.
решение1
Для чего $TERM
?
Переменная $TERM
предназначена для использования приложениями возможностей этого терминала.
Например, если программа хочет отобразить цветной текст, она должна сначала выяснить, поддерживает ли используемый вами терминал цветной текст, а затем, если поддерживает, как сделать так, чтобы текст отображался цветным.
Это работает так: система хранит библиотеку известных терминалов и их возможностей. В большинстве систем это есть /usr/share/terminfo
(есть также termcap, но это наследие, которое больше не используется).
Итак, предположим, у вас есть программа, которая хочет отобразить красный текст. По сути, она делает вызов библиотеки terminfo, которая говорит: "дайте мне последовательность байтов, которую я должен отправить для красного текста для терминала xterm". Затем он просто берет эти байты и выводит их.
Вы можете попробовать это сами, выполнив tput setf 4; echo hi
. Это позволит получить setf
возможность terminfo и передать ей параметр 4
, который является нужным вам цветом.
Почему терминал gnome лжет о себе:
Теперь предположим, что у вас есть какой-то блестящий новый эмулятор терминала, который только что был выпущен, и системная библиотека terminfo еще не имеет определения для него. Когда ваше приложение пытается найти, как что-то сделать, оно потерпит неудачу, потому что терминал неизвестен.
Ваш терминал обходит это, лгая о том, кто он. Так что ваш терминал gnome говорит: "Я икстерм".
Xterm — это очень простой терминал, который существует с самого начала X11, и поэтому большинство эмуляторов терминала поддерживают то, что он поддерживает. Так что, если терминал gnome говорит, что это xterm, скорее всего, у него есть определение в библиотеке terminfo.
Недостатком лжи о типе вашего терминала является то, что терминал может на самом деле поддерживать гораздо больше, чем xterm (например, многие новые терминалы поддерживают 256 цветов, в то время как старые терминалы поддерживали только 16). Таким образом, у вас есть компромисс: вы получаете больше функций или большую совместимость. Большинство терминалов выберут большую совместимость и, таким образом, будут рекламировать себя как xterm
.
Если вы хотите переопределить это, многие терминалы предложат способ настройки поведения. Но вы также можете просто сделать export TERM=gnome-terminal
.
решение2
Переменная окружения TERM
указывает терминалтип, а не терминалприложение. TERM
имеет определенную цель: он сообщает приложениям, работающим на этом терминале, как взаимодействовать с терминалом.
Приложения взаимодействуют с терминалами, записывая escape-последовательности — последовательности символов, которые включают непечатаемые символы и имеют такие эффекты, как перемещение курсора, стирание части экрана, изменение текущего цвета и т. д. В старые времена разные марки физических терминалов имели разные наборы escape-последовательностей. Поэтому операционная система ведет базу данных типов терминалов и их характеристик. Традиционная база данных — этоtermcap(«ВОЗМОЖНОСТИ ТЕРМИНАЛА»); многие современные системы и приложения перешли натерминфо. Обе базы данных индексируются по имени типа терминала, и приложения запрашивают их, используя имя типа терминала из TERM
переменных среды.
В настоящее время большинство терминалов используютстандартный набор последовательностей выходас несколькими общими наборами расширений, поэтому вы не увидите много разных значений TERM
. Большинство эмуляторов терминала с графическим интерфейсом совместимы сxterm, традиционный X-терминал (который до сих пор используется и обслуживается).
Эмуляторы терминала, отличающиеся от xterm, могут добавлять собственную запись в базу данных терминала под своим именем. Однако это не очень хорошо сочетается с удаленными оболочками. Программа, работающая на машине A, но отображающаяся на машине B, например, потому что она была запущена через ssh с B на A, должна запросить базу данных терминала на машине A. Методы удаленного входа, такие как ssh, переносят переменную TERM
окружения, но это полезно только тогда, когда в базе данных терминала B также есть запись для значения user на A. Поэтому многие эмуляторы терминала придерживаются TERM=xterm
того, что практически общеизвестно.
Различия между терминалами в целом определяются не тем, как приложения взаимодействуют с ними, а тем, как терминалы взаимодействуют с пользователем и вписываются в свою среду. Например, Gnome Terminal хорошо выглядит в Gnome и предоставляет вкладки и другие приятные мелочи; Konsole хорошо выглядит в KDE и предоставляет вкладки и другие приятные мелочи; urxvt имеет небольшие требования к памяти; Console2 работает в Windows; screen и tmux предоставляют сеансы, которые можно прикреплять к разным родительским терминалам; и так далее. Поскольку ни одна из этих функций не влияет на приложения, работающие в терминале, большинство эмуляторов терминала используют TERM=xterm
.
Чтобы узнать, в каком терминале запущена оболочка (при условии, что оболочка запущена непосредственно в терминале), посмотрите на родительский элемент оболочки:
ps -p$PPID
решение3
Переменная окружения TERM не обозначает используемый вами терминал.
Переменная окружения 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
консольtoo часто создается с поддержкой 16 цветов. Вы можете попробовать установить TERM в konsole-16color или xterm-16color.
После установки TERM вы можете проверить его, вызвав 'msgcat --color=test' и посмотрев, выглядит ли вывод как разумная цветовая карта. Переменная окружения TERM содержит идентификатор возможностей текстового окна. Вы можете получить подробный список этих возможностей, используя команду 'infocmp', используя 'man 5 terminfo' в качестве ссылки.
решение4
Думаю, стоит отметить, что вы можете узнать ответ на свой первоначальный вопрос, запустив ps -p $$
, т.е. узнать, что такое процесс с текущим pid. Пример вывода:
PID TTY TIME CMD
3045221 pts/17 00:00:00 bash
что совершенно ясно относительно того, какой это терминал.