Де встановлюється за замовчуванням змінна середовище 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).


Відповіді:


17

У багатьох місцях, залежно

У віртуальних терміналах та реальних терміналах TERMзмінна середовища встановлюється програмою, яка приєднується до мережі login, і успадковується весь шлях разом з інтерактивною оболонкою, яка виконується після входу в систему. Де саме це відбувається, залежить від системи до системи та залежно від типу терміналу.

Справжні, серійні, термінали можуть відрізнятися залежно від типу, що знаходиться на іншому кінці проводу. Таким чином, умовно gettyпрограма викликається аргументом, який вказує тип терміналу, або передається TERMпрограмі з даних конфігурації служби менеджера послуг.

  • У initсистемах Van Smoorenburg це можна побачити в /etc/inittabзаписах, які будуть читати щось за рядками

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

    Середовище = 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), програма "знає", що вона може говорити лише з віртуальним терміналом, і вони провіднику "відомих" типів віртуальних терміналів, відповідних операційній системі, для якої була складена програма.
  • У системних системах це можна побачити у /usr/lib/systemd/system/getty@.serviceфайлі одиниць ( /lib/systemd/system/getty@.serviceна не злитих системах), який читає

    Середовище = TERM = linux
    встановлення TERMзмінної в середовищі, переданому в agetty.

Для віртуальних терміналів ядра один тип терміналу не змінюється. Програма термінального емулятора в ядрі зрештою не змінюється. Це неправильно , щоб змінити тип. Зокрема, це призведе до розпізнавання послідовності розпізнавання послідовностей CSI курсору / редагування. Послідовності linuxCSI, що надсилаються емулятором терміналу ядра Linux, відрізняються від послідовностей xtermабо vt100CSI, що надсилаються програмами емулятора терміналів GUI в режимі DEC VT.

Ваш емулятор терміналів GUI - це одна з багатьох програм, починаючи від SSH dæmon screen, використовуючи псевдотермінали. Який тип терміналу залежить від того, яка програма емулятора термінала працює на головній частині псевдотерміналу та як він налаштований. Більшість емуляторів терміналів GUI запускають програму на стороні підлеглого із TERMзмінною, значення якої відповідає їхній термінальній емуляції на головній стороні. Такі програми, як SSH-сервер, спробують "пропустити" тип терміналу, який знаходиться на клієнтському кінці з'єднання. Зазвичай існує емуляція меню або конфігурації для вибору серед емуляцій терміналів.

Стискаюча рука

Правильний спосіб виявити можливість кольорових кольорів - це не налагодження списку типів терміналів у вашому сценарії. Існує дуже багато типів терміналів, які підтримують колір.

Правильний спосіб - подивитися, що термінcap / terminfo говорить про тип вашого терміналу.

колір = 0
якщо tput Co> / dev / null 2> & 1
потім
    тест "` tput Co` "-гт 2 && color = 1
кольори elif tput> / dev / null 2> & 1
потім
    тест "` tput color` "-gt 2 && color = 1
фі

Подальше читання

  • Джонатан де Бойне Поллард (2018). TERM. ніс путівник . Програмне забезпечення.

Далі існує в .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повертає "невідомі можливості терміно" в Джессі та Ксеніалі. 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застаріло). ".Bashrc Ubuntu застарілий."
ІсаакS

@IsaacS Чи є у вас якісь пропозиції, як її покращити? Наприклад, замінили б "застарілу" на "застарілу" допомогу?
egmont

1
Схоже, це xterm-256colorзмушує htopзіпсувати свою компоновку на зразок цього в Ubuntu 18.04.
Перестаньте шкодити Моніці

@OrangeDog У якому емуляторі терміналу? Це запитання тут, і, отже, моя відповідь зосереджена на терміналі GNOME, тоді як на сторінці, яку ви пов’язали, відображається Konsole. Помилка виглядає так, що термінальний емулятор ще не підтримує послідовність завершення REP, яка ncurses почала використовувати за цей час. VTE (термінал GNOME) вже додав підтримку в Ubuntu 18.04, ймовірно, Konsole цього не зробив. Я підозрюю, що ваш коментар із поломкою htop дійсний для Konsole, але не для терміналу GNOME.
Егмонт

@egmont не може говорити за вихідну проблему, але я отримую такий же результат і з терміналом WSL (що б там не було).
Перестаньте шкодити Моніці
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.