Где устанавливается переменная окружения TERM по умолчанию?

26

Когда я открываю окно терминала с эмулятором терминала GNOME в графическом интерфейсе рабочего стола, переменная среды оболочки TERM по умолчанию принимает значение xterm.

Если я использую CTL+ ALT+, F1чтобы переключиться в окно TTY консоли, и echo $TERMзначение устанавливается в linux.

Моя мотивация спрашивать, что внутри моего ~/.bashrcфайла переменная используется для определения, предоставляется ли цветовая оболочка или просто старый добрый монохромный.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

И в командной консоли, и в эмуляторе терминала Gnome, если я наберу

export TERM=xterm-color
source /.bashrc

обе оболочки переходят в цветовой режим (что-то, что я хотел бы, чтобы всегда происходило в обеих)

Где можно установить TERMзначения по умолчанию и где лучше всего изменить их значения по умолчанию, если это вообще возможно? Похоже, что в графическом интерфейсе эмулятора терминала нет ничего, чтобы выбрать или установить значение TERM по умолчанию.

Я решил добавить строку export TERM=xterm-colorв верхнюю часть моего ~/.bashrcфайла, но мой инстинкт подсказывает, что это не лучшее решение, и мои поиски в Google еще не привели меня к хорошему ответу.

Я использую Ubuntu 15.04 Desktop Edition (на основе Debian).

Энди Фусняк
источник
связанные: unix.stackexchange.com/questions/9957/…
thom_nic

Ответы:

17

Во многих местах, в зависимости

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

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

  • На initсистемах Ван Смуренбурга это можно увидеть в /etc/inittabзаписях, которые будут читать что-то вроде

    S0: 3: респаун: / sbin / agetty ttyS0 9600 vt100-nav
    Последний аргумент agettyв этой строке vt100-nav, это тип терминала, установленный для /dev/ttyS0. Так /etc/inittabчто, где изменить тип терминала для реальных терминалов в таких системах.
  • В системах systemd это можно увидеть в /usr/lib/systemd/system/serial-getty@.serviceфайле модуля ( /lib/systemd/system/serial-getty@.serviceв неслитых системах), который гласит:

    Environment = TERM = vt100
    установка TERMпеременной в среде, переданной в agetty. Этот файл сервисного блока предназначен для изменения типа терминала для реальных терминалов в таких системах. Обратите внимание, что это относится ко всем реальным терминалам, которые используют этот шаблон сервисного блока. (Чтобы изменить его только для отдельных терминалов, необходимо вручную создать экземпляр шаблона.)
  • На BSD initберет тип терминала из третьего поля каждой записи терминала в /etc/ttysбазе данных и устанавливает его TERMв среде, с которой он выполняет getty. Так /etc/ttys, где можно изменить тип терминала для реальных терминалов на BSD.

Виртуальные терминалы ядра, как вы заметили, имеют фиксированный тип. В отличие от NetBSD, который может на лету изменять тип виртуального терминала ядра, Linux и другие BSD имеют один фиксированный тип терминала, реализованный в встроенной в ядро ​​программе эмуляции терминала. В Linux этот тип совпадает linuxс базой данных terminfo. (Эмуляция терминала ядра FreeBSD является ограниченным xtermподмножеством начиная с версии 9.)

  • В системах, использующих mingettyили vc-get-tty(из пакета nosh), программа «знает», что она может разговаривать только с виртуальным терминалом, и они используют «известные» типы виртуальных терминалов, соответствующие операционной системе, для которой была скомпилирована программа.
  • В системах systemd это можно увидеть в /usr/lib/systemd/system/getty@.serviceфайле модуля ( /lib/systemd/system/getty@.serviceв неслитых системах), который гласит:

    Environment = TERM = Linux
    установка TERMпеременной в среде, переданной в agetty.

Для виртуальных терминалов ядра нельзя изменить тип терминала. В конце концов, программа эмулятора терминала в ядре не меняется. Это неправильно , чтобы изменить тип. В частности, это испортит курсор / ключ редактирования распознавания последовательности CSI. Последовательности linuxCSI, отправляемые эмулятором терминала ядра Linux, отличаются от последовательностей xtermили vt100CSI, отправляемых программами эмулятора терминала GUI в режиме DEC VT.

Ваш эмулятор терминала с графическим интерфейсом - одна из многих программ, от SSH-демона до screen, которая использует псевдо-терминалы. Тип терминала зависит от того, какая программа эмулятора терминала запущена на главной стороне псевдотерминала и как она настроена. Большинство эмуляторов терминала GUI запускают программу на ведомой стороне с TERMпеременной, значение которой соответствует их эмуляции терминала на ведущей стороне. Такие программы, как сервер SSH, будут пытаться «пройти» через тип терминала, который находится на стороне клиента соединения. Обычно есть эмуляция терминала или меню или опция конфигурации.

Захватывающая рука

Правильный способ определения цветовых возможностей - не фиксировать список типов терминалов в вашем скрипте. Существует огромное количество типов терминалов, которые поддерживают цвет.

Правильный путь - посмотреть, что termcap / terminfo говорит о типе вашего терминала.

цвет = 0
если tput Co> / dev / null 2> & 1
тогда
    test "` tput Co` "-gt 2 && color = 1
elif tput colors> / dev / null 2> & 1
тогда
    test "` tput colors` "-gt 2 && color = 1
фи

дальнейшее чтение

  • Джонатан де Бойн Поллард (2018). TERM, Руководство Nosh . Softwares.
JdeBP
источник
Далее существует в .bashrc по умолчанию в Debian Jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic
2
Также tput Coвозвращает «неизвестную возможность terminfo» в Jessie и Xenial. tput colorsи tput setaf 1оба, кажется, работают, хотя я признаю, что не понимаю почему .
thom_nic
2

Пожалуйста, смотрите /ubuntu//a/614714/398785 для моего подробного ответа о том, почему я считаю TERM=xterm-colorнеправильный подход, а Ubuntu .bashrcустарел. Я рекомендую вам перейти TERM=xterm-256color(который используется по умолчанию с gnome-терминала 3.16, но также безопасен для использования с более старыми gnome-терминалами) и настроить его .bashrcсоответствующим образом.

Эгмонт
источник
1
+1 за вашу ссылку. Незначительное предложение; следующее предложение может сбить с толку (у меня сначала создалось впечатление, что вы говорите, что использование .bashrcустарело). «Ubuntu .bashrc устарел».
Исаак
@IsaacS У вас есть предложение, как его улучшить? Например, заменить «устаревшую» на «устаревшую» помощь?
egmont
1
Похоже, что это xterm-256colorприводит htopк путанице его макета, как это в Ubuntu 18.04.
Стоп Harm Monica
@OrangeDog В каком терминальном эмуляторе? Этот вопрос здесь и, следовательно, мой ответ сфокусирован на терминале GNOME, тогда как на странице, на которую вы ссылаетесь, отображается Konsole. Ошибка выглядит так, как будто эмулятор терминала еще не поддерживает escape-последовательность REP, которую ncurses начал использовать примерно в то же время. VTE (GNOME Terminal) уже добавил поддержку в Ubuntu 18.04, скорее всего, Konsole этого не сделали. Я подозреваю, что ваш комментарий с поломкой htop действителен для Konsole, но не для терминала GNOME.
egmont
@egmont не может говорить о первоначальной проблеме, но я получаю тот же результат с терминалом WSL (что бы это ни было).
Стоп Harm Monica