Como e onde $ TERM é interpretado?

9

Eu estou querendo saber como alguma mágica terminal funciona internamente.

Ao brincar com contêineres de docker, a variável de ambiente $TERMnão foi definida. Isso levou a aplicativos de console de aparência estranha, como vim e tmux, mas também a ignorância de CTRL + l (tela limpa).

Tenho certeza de que todos os recursos, como atualizações parciais da tela, cores, comandos como redefinição da tela etc., são realizados usando códigos de escape, certo?

Então, onde essa variável é interpretada e permite, por exemplo, redefinir minha tela de terminal usando CTRL + l, se eu definir o valor certo lá? Quem verifica, por exemplo, quais cores são suportadas (xterm x xterm-256color)? A concha? O aplicativo ou uma biblioteca como ncurses? E onde são definidos os possíveis valores / tipos de terminais?

muffel
fonte

Respostas:

8

$TERMé lido e interpretado pelo sistema terminfo. terminfo também se refere ao banco de dados de descrições de terminais que você pode encontrar na maioria dos sistemas /usr/share/terminfo. $TERMdeve corresponder a uma das entradas nesse banco de dados. Havia também uma biblioteca mais antiga chamada termcap que tinha menos recursos, mas o terminfo a substituiu. Nos sistemas modernos, o terminfo faz parte da biblioteca ncurses.

Os aplicativos geralmente buscam os recursos do terminal diretamente usando funções de biblioteca tigetstr()ou usam interfaces de nível superior para gerenciar o layout da tela. De qualquer forma, $TERMo banco de dados terminfo será consultado.

Celada
fonte
5

A TERMvariável é interpretada por cada aplicativo, através das bibliotecas do sistema. Seu valor é um nome que é procurado em um banco de dados. Dependendo do sabor do Unix e sua idade, o banco de dados pode ser termcap (tradicional, pouco usado hoje em dia) ou terminfo (moderno, na medida em que foi concebido como uma melhoria no termcap e usado pela maioria dos sistemas atualmente).

Os bancos de dados termcap e terminfo associam nomes de recursos a valores. Os recursos são descrições do que o terminal pode fazer (número de linhas, capacidade de sublinhar etc.) ou seqüências de caracteres que podem ser trocadas com o terminal (sequências de escape para formatar o texto, mover o cursor etc.) e no outro seqüências de escape de direção enviadas por teclas de função). Você pode ver man 5 termcape man 5 terminfover quais recursos são conhecidos no seu sistema.

Por exemplo, quando você pressiona Ctrl+ Lpara redesenhar a tela, ele lê os recursos no banco de dados do terminal para descobrir quais seqüências de escape ele deve usar para mover o cursor. Se TERMnão estiver definido ou incorretamente, a tela não tem como saber como mover o cursor.

Você pode usar o tputcomando para recuperar entradas no banco de dados terminfo. Por exemplo, tput linesimprime o número de linhas no terminal. tput clearlimpa a tela (porque sua saída está sendo impressa no terminal); para ver qual é a sequência de escape correspondente, imprima-a de forma legível, por exemplo tput clear | cat -v.

O número de cores tem um pouco de história que faz com que não funcione como deveria por direito: os emuladores de terminal tendem a subnotificar seu número de cores, para evitar a quebra de alguns aplicativos. Veja o suporte ao tmux, TERM e 256 cores para obter mais informações, especialmente no contexto do tmux. A diferença entre xterm-256colorse xtermé que o primeiro relata 256 cores no terminfo, enquanto o segundo relata o tradicional 8.

Gilles 'SO- parar de ser mau'
fonte
2

TERM, por convenção, refere-se a uma descrição do terminal. Originalmente, isso nomeava uma seção de um arquivo de texto termcap (começando no final da década de 1970). Em meados da década de 1980, o terminfo foi introduzido como um arquivo compilado (binário) que economizava tempo ao obter a descrição do terminal. Embora ambos estejam disponíveis para todas as plataformas do tipo Unix, o termcap raramente é usado hoje, exceto como uma emulação usando terminfo.

Para esses dois formatos de dados, os aplicativos geralmente extraem dados do banco de dados do terminal com bibliotecas de programação reutilizáveis. A biblioteca de programação terminfo geralmente faz parte da biblioteca de maldições de nível superior, embora possa ser fornecida (por exemplo, opcionalmente como em ncurses) como um arquivo de biblioteca separado. Se a biblioteca terminfo é fornecida separadamente ou não, nesses casos, ela é considerada parte da biblioteca de maldições. (Existem também algumas outras bibliotecas de nível superior, como gírias).

A entrada do banco de dados do terminal para cada terminal contém propriedades conhecidas como recursos . Eles dizem à biblioteca de maldições (ou aplicativos que usam diretamente termcap / terminfo) como executar operações úteis, como limpar a tela. Para a maioria dos terminais, essa é uma sequência de escape. Alguns terminais podem não suportar uma sequência de escape para esse fim; existem outros recursos que podem ser combinados pela biblioteca de maldições para limpar a tela (como limpar cada linha). Nem todos os recursos são seqüências de escape. Também existem recursos booleanos e numéricos , por exemplo, para saber se um recurso é suportado e qual o tamanho de algo (como o tamanho da tela).

Cada aplicativo que usa termcap / terminfo usa a biblioteca correspondente para recuperar a descrição do terminal, bem como executar operações como a substituição de parâmetros em determinados recursos. Por exemplo, a maioria dos terminais oferece a capacidade de mover o cursor por um determinado número de colunas ou linhas a partir de sua localização atual. As funções tparm(ou tiparm) substituem o número na capacidade de obter a sequência de escape real.

A biblioteca curses possui aplicativos de linha de comando que mantêm o banco de dados do terminal ( tic , infocmp ) e alguns são usados ​​em scripts de shell para consultar o banco de dados do terminal ou executar operações de baixo nível com recursos de terminal ( tput , tset / reset ).

Existem aplicativos não convencionais que são usados TERMsem o uso do banco de dados do terminal. A maioria deles simplesmente codifica seu comportamento (como GNU grep, groff e os links / links2 / elinks navegadores de texto), enquanto alguns têm o que equivale a seu próprio banco de dados de terminal (como GNU ls), mas usando regras e métodos diferentes. comportamento.

Voltar para as perguntas:

  • Então, onde essa variável é interpretada e permite, por exemplo, redefinir minha tela de terminal usando CTRL + l, se eu definir o valor certo?

    O aplicativo e as bibliotecas subjacentes interpretam esse valor. Pois controlL, isso pode ser feito para o bash na biblioteca readline (que usa uma interface de programação termcap).

  • Quem verifica, por exemplo, quais cores são suportadas (xterm x xterm-256color)?

    O banco de dados do terminal armazena o número de cores como um recurso, juntamente com os recursos para definir as cores de primeiro e segundo plano e redefinir as cores. Alguns aplicativos combinam esses recursos com outras informações (como a afirmação de um desenvolvedor que xtermé "realmente" xterm-256color).

  • A concha?

    A maioria dos shells usa uma interface de programação termcap para obter as informações do terminal. No entanto, são aplicativos que têm seu próprio comportamento (não necessariamente o mesmo que maldições).

  • O aplicativo ou uma biblioteca como ncurses?

    (veja acima: conchas são um tipo específico de aplicação)

  • E onde são definidos os possíveis valores / tipos de terminais?

    Geralmente, isso está em um banco de dados de terminal compartilhado por aplicativos usando as bibliotecas de maldições ou gírias. Alguns aplicativos são codificados permanentemente ou usam um banco de dados privado.

Leitura adicional:

Thomas Dickey
fonte