Какие "плохие" вещи могут произойти (и почему ), если эмулятор терминала и запущенная в нем оболочка используют разные типы TERM?

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

Без оконного менеджера вам обычно нужно указывать геометрию в программах, чтобы не все было размещено в верхнем левом углу.

В X оконный менеджер — это просто еще один X-клиент. В то время это было необычно, но упростило использование разных оконных менеджеров.

Другой способ взглянуть на этот вопрос — заметить, что вы можете менять оконные менеджеры на лету, поэтому есть время между остановкой первого и получением управления вторым, но поскольку все ваши приложения не аварийно завершают работу, они надо уметь работать без.

0
11.02.2021, 04:27
3 ответа

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

Теоретически тип терминала, идентифицируемый переменной TERM, будет точно описан описанием типа терминала, расположенным в дереве каталогов /usr/share/terminfo/. На практике эмулятор терминала может иметь ошибки, из-за которых его поведение отклоняется от спецификации типа.

(Сами спецификации типа терминала также могут содержать ошибки, но это очень старая технология, и большинство ошибок давно устранено.)

По аналогии, терминалы будут говорить на своем (с )родном языке; приложения обычно не говорят об этом напрямую,но используйте базу данных terminfo как набор словарей/разговорников для связи с терминалами. Переменная окружения TERM определяет, какой словарь/разговорник использовать.

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

Вы можете увидеть на экране несколько ненужных символов, если программа попытается использовать функцию, которой нет в вашем реальном типе терминала. Если ошибка имеет другой вид (, т.е. описание типа терминала не включает функцию, которая на самом деле есть у вашего терминала ), тогда программа будет вести себя так, как будто на вашем терминале эта функция недоступна.

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

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

Пример использования очень старого терминала см. в видео CuriousMarc на YouTube :https://youtu.be/2XLZ4Z8LpEE?t=501

Обратите внимание, что в видео на самом деле было конкретное значение TERM tty33, доступное в Linux, хотя CuriousMarc agettyустановил его для него вместо прямого назначения переменной TERM. Значение dumbможет быть даже более голым -костей, чем это!

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

Для жестких -последовательных терминалов системный администратор должен был настроить правильный тип терминала при добавлении процесса gettyдля каждого последовательного порта, подключенного к новому терминалу. Для модемных линий система может быть настроена так, чтобы запрашивать у пользователя правильный тип терминала в /etc/profileили подобное, если сеанс не был обнаружен как не -интерактивный.

Были некоторые усовершенствования для автоматического -определения типа терминала, но они не были надежными для всех обстоятельств (, поскольку было слишком много различных старых типов терминалов ), поэтому автоматическое -определение оставалось необязательным. функция, которую можно включить, если администратор сочтет, что она того стоит.

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

3
18.03.2021, 22:31

PuTTY использует только этот параметр конфигурации «тип терминала» для переменной среды по умолчанию TERM, используемой PuTTY -клиентом -ssh -при запросе псевдо -терминал на удаленном -сервере .

Использование этого параметра для определения терминальных последовательностей, которые PuTTY --терминал -эмулятор распознает и как он их интерпретирует, было бы довольно глупо --и на самом деле PuTTY не делать этого .

1
18.03.2021, 22:31

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

Есть несколько проблем, когда описание терминала не соответствует терминалу:

  • если в нем указана возможность, которую терминал реализует иначе, то приложения будут вести себя некорректно
  • если в нем отсутствует функция, реализуемая терминалом, приложения будут игнорировать эту функцию
  • Если в нем указана возможность, которую терминал не реализует, опять же, приложения будут вести себя неправильно.

Рекомендуемые описания терминала для PuTTY: "замазка" и "замазка -256цвет" . Использование infocmp для демонстрации различий служит иллюстрацией :

.
  • Вообще говоря, терминалы, которые поддерживают 256 -цветов, также поддерживают 8 цветов. Внутри каждой группы есть различия. В PuTTY отсутствует возможность настраивать цветовую палитру (, поэтому его поддержка 256 -цветов является неполной ), но частично поддерживает эту функцию :
  • .
    comparing putty to putty-256color.
        comparing booleans.
        ccc: T:F.
        comparing numbers.
        colors: 8, 256.
        pairs: 64, 65536.
        comparing strings.
        initc: '\E]P%p1%x%p2%{255}%*%{1000}%/%02x%p3%{255}%*%{1000}%/%02x%p4%{255}%*%{1000}%/%02x', NULL.
        setab: '\E[4%p1%dm', '\E[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m'.
        setaf: '\E[3%p1%dm', '\E[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m'.

Сравнение «замазки» с linux показывает, что у каждого из них есть функции, которых нет у другого, и что некоторые общие функции отличаются:

comparing putty to linux.
    comparing booleans.
    bw: T:F.
    eo: F:T.
    hs: T:F.
    AX: F:T.
    XT: T:F.
    comparing numbers.
    ncv: 22, 18.
    comparing strings.
    acsc: '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~', '++\,\,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
    cbt: '\E[Z', NULL.
    civis: '\E[?25l', '\E[?25l\E[?1c'.
    cnorm: '\E[?25h', '\E[?25h\E[?0c'.
    cud1: '\ED', '\n'.
    cuu1: '\EM', '\E[A'.
    cvvis: NULL, '\E[?25h\E[?8c'.
    dim: NULL, '\E[2m'.
    dispc: '%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;', NULL.
    dsl: '\E]0;\007', NULL.
    enacs: '\E(B\E)0', '\E)0'.
    flash: '\E[?5h$<100/>\E[?5l', '\E[?5h$\E[?5l'.
    fsl: '^G', NULL.
    ich: NULL, '\E[%p1%d@'.
    ich1: NULL, '\E[@'.
    indn: '\E[%p1%dS', NULL.
    is2: '\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R', NULL.
    ka1: '\EOq', NULL.
    ka3: '\EOs', NULL.
    kb2: '\EOr', '\E[G'.
    kc1: '\EOp', NULL.
    kc3: '\EOn', NULL.
    kcub1: '\EOD', '\E[D'.
    kcud1: '\EOB', '\E[B'.
    kcuf1: '\EOC', '\E[C'.
    kcuu1: '\EOA', '\E[A'.
    kent: '\EOM', NULL.
    kf0: '\EOy', NULL.
    kf1: '\E[11~', '\E[[A'.
    kf2: '\E[12~', '\E[[B'.
    kf3: '\E[13~', '\E[[C'.
    kf4: '\E[14~', '\E[[D'.
    kf5: '\E[15~', '\E[[E'.
    kind: '\E[B', NULL.
    kmous: '\E[', NULL.
    rs1: NULL, '\Ec\E]R'.
    rs2: '\E<\E["p\E[50;6"p\Ec\E[?3l\E]R\E[?1000l', NULL.
    s0ds: '\E[10m', NULL.
    s1ds: '\E[11m', NULL.
    s2ds: '\E[12m', NULL.
    sgr: '\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;', '\E[0;10%?%p1%t;7%;%?%p2%t;4%;%?%p3%t;7%;%?%p4%t;5%;%?%p5%t;2%;%?%p6%t;1%;m%?%p9%t\016%e\017%;'.
    smcup: '\E[?47h', NULL.
    smkx: '\E[?1h\E=', NULL.
    tsl: '\E]0;', NULL.
    TS: '\E]0;', NULL.
    XM: '\E[?1006;1000%?%p1%{1}%=%th%el%;', NULL.
    kp1: '\EOq', NULL.
    kp2: '\EOr', NULL.
    kp3: '\EOs', NULL.
    kp4: '\EOt', NULL.
    kp5: '\EOu', NULL.
    kp6: '\EOv', NULL.
    kp7: '\EOw', NULL.
    kp8: '\EOx', NULL.
    kp9: '\EOy', NULL.
    kpADD: '\EOl', NULL.
    kpDIV: '\EOQ', NULL.
    kpDOT: '\EOn', NULL.
    kpMUL: '\EOR', NULL.
    kpNUM: '\EOP', NULL.
    kpSUB: '\EOS', NULL.
    kpZRO: '\EOp', NULL.
    xm: '\E[<%i%p3%d;%p1%d;%p2%d;%?%p4%tM%em%;', NULL.

Сравнение "putty -256color" и xterm -256color показывает, что PuTTY не (например )реализует большинство функций -комбинаций клавиш, которые предоставляет xterm:

comparing putty-256color to xterm-256color.
    comparing booleans.
    OTbs: F:T.
    bw: T:F.
    ccc: F:T.
    hs: T:F.
    km: F:T.
    mc5i: F:T.
    npc: F:T.
    xon: T:F.
    AX: F:T.
    comparing numbers.
    cols: NULL, 80.
    lines: NULL, 24.
    ncv: 22, NULL.
    U8: 1, NULL.
    comparing strings.
    acsc: '``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~', '``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~'.
    clear: '\E[H\E[J', '\E[H\E[2J'.
    cnorm: '\E[?25h', '\E[?12l\E[?25h'.
    cud1: '\ED', '\n'.
    cuu1: '\EM', '\E[A'.
    cvvis: NULL, '\E[?12;25h'.
    dim: NULL, '\E[2m'.
    dispc: '%?%p1%{8}%=%t\E%%G\342\227\230\E%%@%e%p1%{10}%=%t\E%%G\342\227\231\E%%@%e%p1%{12}%=%t\E%%G\342\231\0\E%%@%e%p1%{13}%=%t\E%%G\342\231\252\E%%@%e%p1%{14}%=%t\E%%G\342\231\253\E%%@%e%p1%{15}%=%t\E%%G\342\230\274\E%%@%e%p1%{27}%=%t\E%%G\342\206\220\E%%@%e%p1%{155}%=%t\E%%G\340\202\242\E%%@%e%p1%c%;', NULL.
    dsl: '\E]0;\007', NULL.
    enacs: '\E(B\E)0', NULL.
    fsl: '^G', NULL.
    ich: NULL, '\E[%p1%d@'.
    initc: NULL, '\E]4;%p1%d;rgb\:%p2%{255}%*%{1000}%/%2.2X/%p3%{255}%*%{1000}%/%2.2X/%p4%{255}%*%{1000}%/%2.2X\E\\'.
    invis: NULL, '\E[8m'.
    is2: '\E7\E[r\E[m\E[?7h\E[?1;4;6l\E[4l\E8\E>\E]R', '\E[!p\E[?3;4l\E[4l\E>'.
    kDC: NULL, '\E[3;2~'.
    kEND: NULL, '\E[1;2F'.
    kHOM: NULL, '\E[1;2H'.
    kIC: NULL, '\E[2;2~'.
    kLFT: NULL, '\E[1;2D'.
    kNXT: NULL, '\E[6;2~'.
    kPRV: NULL, '\E[5;2~'.
    kRIT: NULL, '\E[1;2C'.
    ka1: '\EOq', '\EOw'.
    ka3: '\EOs', '\EOy'.
    kb2: '\EOr', '\EOu'.
    kc1: '\EOp', '\EOq'.
    kc3: '\EOn', '\EOs'.
    kend: '\E[4~', '\EOF'.
    kf0: '\EOy', NULL.
    kf1: '\E[11~', '\EOP'.
    kf13: '\E[25~', '\E[1;2P'.
    kf14: '\E[26~', '\E[1;2Q'.
    kf15: '\E[28~', '\E[1;2R'.
    kf16: '\E[29~', '\E[1;2S'.
    kf17: '\E[31~', '\E[15;2~'.
    kf18: '\E[32~', '\E[17;2~'.
    kf19: '\E[33~', '\E[18;2~'.
    kf2: '\E[12~', '\EOQ'.
    kf20: '\E[34~', '\E[19;2~'.
    kf21: NULL, '\E[20;2~'.
    kf22: NULL, '\E[21;2~'.
    kf23: NULL, '\E[23;2~'.
    kf24: NULL, '\E[24;2~'.
    kf25: NULL, '\E[1;5P'.
    kf26: NULL, '\E[1;5Q'.
    kf27: NULL, '\E[1;5R'.
    kf28: NULL, '\E[1;5S'.
    kf29: NULL, '\E[15;5~'.
    kf3: '\E[13~', '\EOR'.
    kf30: NULL, '\E[17;5~'.
    kf31: NULL, '\E[18;5~'.
    kf32: NULL, '\E[19;5~'.
    kf33: NULL, '\E[20;5~'.
    kf34: NULL, '\E[21;5~'.
    kf35: NULL, '\E[23;5~'.
    kf36: NULL, '\E[24;5~'.
    kf37: NULL, '\E[1;6P'.
    kf38: NULL, '\E[1;6Q'.
    kf39: NULL, '\E[1;6R'.
    kf4: '\E[14~', '\EOS'.
    kf40: NULL, '\E[1;6S'.
    kf41: NULL, '\E[15;6~'.
    kf42: NULL, '\E[17;6~'.
    kf43: NULL, '\E[18;6~'.
    kf44: NULL, '\E[19;6~'.
    kf45: NULL, '\E[20;6~'.
    kf46: NULL, '\E[21;6~'.
    kf47: NULL, '\E[23;6~'.
    kf48: NULL, '\E[24;6~'.
    kf49: NULL, '\E[1;3P'.
    kf50: NULL, '\E[1;3Q'.
    kf51: NULL, '\E[1;3R'.
    kf52: NULL, '\E[1;3S'.
    kf53: NULL, '\E[15;3~'.
    kf54: NULL, '\E[17;3~'.
    kf55: NULL, '\E[18;3~'.
    kf56: NULL, '\E[19;3~'.
    kf57: NULL, '\E[20;3~'.
    kf58: NULL, '\E[21;3~'.
    kf59: NULL, '\E[23;3~'.
    kf60: NULL, '\E[24;3~'.
    kf61: NULL, '\E[1;4P'.
    kf62: NULL, '\E[1;4Q'.
    kf63: NULL, '\E[1;4R'.
    khome: '\E[1~', '\EOH'.
    kind: '\E[B', '\E[1;2B'.
    kri: '\E[A', '\E[1;2A'.
    kspd: '^Z', NULL.
    mc0: NULL, '\E[i'.
    mc4: NULL, '\E[4i'.
    mc5: NULL, '\E[5i'.
    meml: NULL, '\El'.
    memu: NULL, '\Em'.
    mgc: NULL, '\E[?69l'.
    nel: '\r\n', NULL.
    oc: '\E]R', '\E]104\007'.
    ritm: NULL, '\E[23m'.
    rmacs: '^O', '\E(B'.
    rmcup: '\E[2J\E[?47l', '\E[?1049l\E[23;0;0t'.
    rmm: NULL, '\E[?1034l'.
    rmpch: '\E[10m', NULL.
    rs1: NULL, '\Ec\E]104\007'.
    rs2: '\E'.
    s0ds: '\E[10m', NULL.
    s1ds: '\E[11m', NULL.
    s2ds: '\E[12m', NULL.
    sgr: '\E[0%?%p1%p6%|%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;m%?%p9%t\016%e\017%;', '%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p5%t;2%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p7%t;8%;m'.
    sgr0: '\E[m\017', '\E(B\E[m'.
    sitm: NULL, '\E[3m'.
    smacs: '^N', '\E(0'.
    smcup: '\E[?47h', '\E[?1049h\E[22;0;0t'.
    smglr: NULL, '\E[?69h\E[%i%p1%d;%p2%ds'.
    smm: NULL, '\E[?1034h'.
    smpch: '\E[11m', NULL.
    tsl: '\E]0;', NULL.
    u8: '\E[?6c', '\E[?%[;0123456789]c'.
    Cr: NULL, '\E]112\007'.
    Cs: NULL, '\E]12;%p1%s\007'.
    Ms: NULL, '\E]52;%p1%s;%p2%s\007'.
    Se: NULL, '\E[2 q'.
    Ss: NULL, '\E[%p1%d q'.
    TS: '\E]0;', NULL.
    kDC3: NULL, '\E[3;3~'.
    kDC4: NULL, '\E[3;4~'.
    kDC5: NULL, '\E[3;5~'.
    kDC6: NULL, '\E[3;6~'.
    kDC7: NULL, '\E[3;7~'.
    kDN: NULL, '\E[1;2B'.
    kDN3: NULL, '\E[1;3B'.
    kDN4: NULL, '\E[1;4B'.
    kDN5: NULL, '\E[1;5B'.
    kDN6: NULL, '\E[1;6B'.
    kDN7: NULL, '\E[1;7B'.
    kEND3: NULL, '\E[1;3F'.
    kEND4: NULL, '\E[1;4F'.
    kEND5: NULL, '\E[1;5F'.
    kEND6: NULL, '\E[1;6F'.
    kEND7: NULL, '\E[1;7F'.
    kHOM3: NULL, '\E[1;3H'.
    kHOM4: NULL, '\E[1;4H'.
    kHOM5: NULL, '\E[1;5H'.
    kHOM6: NULL, '\E[1;6H'.
    kHOM7: NULL, '\E[1;7H'.
    kIC3: NULL, '\E[2;3~'.
    kIC4: NULL, '\E[2;4~'.
    kIC5: NULL, '\E[2;5~'.
    kIC6: NULL, '\E[2;6~'.
    kIC7: NULL, '\E[2;7~'.
    kLFT3: NULL, '\E[1;3D'.
    kLFT4: NULL, '\E[1;4D'.
    kLFT5: NULL, '\E[1;5D'.
    kLFT6: NULL, '\E[1;6D'.
    kLFT7: NULL, '\E[1;7D'.
    kNXT3: NULL, '\E[6;3~'.
    kNXT4: NULL, '\E[6;4~'.
    kNXT5: NULL, '\E[6;5~'.
    kNXT6: NULL, '\E[6;6~'.
    kNXT7: NULL, '\E[6;7~'.
    kPRV3: NULL, '\E[5;3~'.
    kPRV4: NULL, '\E[5;4~'.
    kPRV5: NULL, '\E[5;5~'.
    kPRV6: NULL, '\E[5;6~'.
    kPRV7: NULL, '\E[5;7~'.
    kRIT3: NULL, '\E[1;3C'.
    kRIT4: NULL, '\E[1;4C'.
    kRIT5: NULL, '\E[1;5C'.
    kRIT6: NULL, '\E[1;6C'.
    kRIT7: NULL, '\E[1;7C'.
    kUP: NULL, '\E[1;2A'.
    kUP3: NULL, '\E[1;3A'.
    kUP4: NULL, '\E[1;4A'.
    kUP5: NULL, '\E[1;5A'.
    kUP6: NULL, '\E[1;6A'.
    kUP7: NULL, '\E[1;7A'.
    ka2: NULL, '\EOx'.
    kb1: NULL, '\EOt'.
    kb3: NULL, '\EOv'.
    kc2: NULL, '\EOr'.
    kp1: '\EOq', NULL.
    kp2: '\EOr', NULL.
    kp3: '\EOs', NULL.
    kp4: '\EOt', NULL.
    kp5: '\EOu', '\EOE'.
    kp6: '\EOv', NULL.
    kp7: '\EOw', NULL.
    kp8: '\EOx', NULL.
    kp9: '\EOy', NULL.
    kpADD: '\EOl', '\EOk'.
    kpCMA: NULL, '\EOl'.
    kpDIV: '\EOQ', '\EOo'.
    kpMUL: '\EOR', '\EOj'.
    kpNUM: '\EOP', NULL.
    kpSUB: '\EOS', '\EOm'.
    rmxx: NULL, '\E[29m'.
    smxx: NULL, '\E[9m'.
1
18.03.2021, 22:31

Теги

Похожие вопросы