Когда я открываю окно терминала с эмулятором терминала 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).
Ответы:
Во многих местах, в зависимости
На виртуальных терминалах и реальных терминалах
TERM
переменная окружения задается программой, к которой она привязанаlogin
, и наследуется на всем пути до интерактивной оболочки, которая выполняется после входа в систему. Где именно это происходит, зависит от системы и в зависимости от типа терминала.Реальные, последовательные клеммы могут различаться по типу, в зависимости от того, что находится на другом конце провода. Поэтому обычно
getty
программа вызывается с аргументом, который указывает тип терминала, или передаетсяTERM
программе из данных конфигурации службы диспетчера служб.init
системах Ван Смуренбурга это можно увидеть в/etc/inittab
записях, которые будут читать что-то вроде Последний аргументagetty
в этой строкеvt100-nav
, это тип терминала, установленный для/dev/ttyS0
. Так/etc/inittab
что, где изменить тип терминала для реальных терминалов в таких системах./usr/lib/systemd/system/serial-getty@.service
файле модуля (/lib/systemd/system/serial-getty@.service
в неслитых системах), который гласит: установкаTERM
переменной в среде, переданной вagetty
. Этот файл сервисного блока предназначен для изменения типа терминала для реальных терминалов в таких системах. Обратите внимание, что это относится ко всем реальным терминалам, которые используют этот шаблон сервисного блока. (Чтобы изменить его только для отдельных терминалов, необходимо вручную создать экземпляр шаблона.)init
берет тип терминала из третьего поля каждой записи терминала в/etc/ttys
базе данных и устанавливает егоTERM
в среде, с которой он выполняетgetty
. Так/etc/ttys
, где можно изменить тип терминала для реальных терминалов на BSD.Виртуальные терминалы ядра, как вы заметили, имеют фиксированный тип. В отличие от NetBSD, который может на лету изменять тип виртуального терминала ядра, Linux и другие BSD имеют один фиксированный тип терминала, реализованный в встроенной в ядро программе эмуляции терминала. В Linux этот тип совпадает
linux
с базой данных terminfo. (Эмуляция терминала ядра FreeBSD является ограниченнымxterm
подмножеством начиная с версии 9.)mingetty
илиvc-get-tty
(из пакета nosh), программа «знает», что она может разговаривать только с виртуальным терминалом, и они используют «известные» типы виртуальных терминалов, соответствующие операционной системе, для которой была скомпилирована программа./usr/lib/systemd/system/getty@.service
файле модуля (/lib/systemd/system/getty@.service
в неслитых системах), который гласит: установкаTERM
переменной в среде, переданной вagetty
.Для виртуальных терминалов ядра нельзя изменить тип терминала. В конце концов, программа эмулятора терминала в ядре не меняется. Это неправильно , чтобы изменить тип. В частности, это испортит курсор / ключ редактирования распознавания последовательности CSI. Последовательности
linux
CSI, отправляемые эмулятором терминала ядра Linux, отличаются от последовательностейxterm
илиvt100
CSI, отправляемых программами эмулятора терминала GUI в режиме DEC VT.Ваш эмулятор терминала с графическим интерфейсом - одна из многих программ, от SSH-демона до
screen
, которая использует псевдо-терминалы. Тип терминала зависит от того, какая программа эмулятора терминала запущена на главной стороне псевдотерминала и как она настроена. Большинство эмуляторов терминала GUI запускают программу на ведомой стороне сTERM
переменной, значение которой соответствует их эмуляции терминала на ведущей стороне. Такие программы, как сервер SSH, будут пытаться «пройти» через тип терминала, который находится на стороне клиента соединения. Обычно есть эмуляция терминала или меню или опция конфигурации.Захватывающая рука
Правильный способ определения цветовых возможностей - не фиксировать список типов терминалов в вашем скрипте. Существует огромное количество типов терминалов, которые поддерживают цвет.
Правильный путь - посмотреть, что termcap / terminfo говорит о типе вашего терминала.
дальнейшее чтение
TERM
, Руководство Nosh . Softwares.источник
[ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes
. (ncurses 5.9)tput Co
возвращает «неизвестную возможность terminfo» в Jessie и Xenial.tput colors
иtput setaf 1
оба, кажется, работают, хотя я признаю, что не понимаю почему .Пожалуйста, смотрите /ubuntu//a/614714/398785 для моего подробного ответа о том, почему я считаю
TERM=xterm-color
неправильный подход, а Ubuntu.bashrc
устарел. Я рекомендую вам перейтиTERM=xterm-256color
(который используется по умолчанию с gnome-терминала 3.16, но также безопасен для использования с более старыми gnome-терминалами) и настроить его.bashrc
соответствующим образом.источник
.bashrc
устарело). «Ubuntu .bashrc устарел».xterm-256color
приводитhtop
к путанице его макета, как это в Ubuntu 18.04.