Que tipo de terminal estou usando?

51

Eu testei isso com o Ubuntu 12.04 e Debian 7. Quando eu faço

echo $TERM

eu recebo

xterm

Mas se eu usar o menu suspenso "ajuda"> "sobre", ele diz gnome terminal 3.4.1.1.

Isso significa que estou usando apenas o gnome-terminal? Ou apenas xterm? Ou o gnome-terminal é uma extensão do xterm? Estou confuso.

Mulllhausen
fonte

Respostas:

49

Para que serve $TERM?

A $TERMvariável é para ser usada por aplicativos para aproveitar os recursos desse terminal.

Por exemplo, se um programa deseja exibir texto colorido, ele deve primeiro descobrir se o terminal que você está usando suporta texto colorido e, em caso afirmativo, como executar o texto colorido.

A maneira como isso funciona é que o sistema mantém uma biblioteca de terminais conhecidos e seus recursos. Na maioria dos sistemas, existe /usr/share/terminfo(existe também termcap, mas seu legado não é mais usado muito).

Então, digamos que você tenha um programa que deseja exibir texto em vermelho. Basicamente, faz uma chamada para a biblioteca terminfo que diz " me dê a sequência de bytes que tenho que enviar em texto vermelho para o terminal xterm ". Depois, apenas pega esses bytes e os imprime.
Você pode tentar fazer isso sozinho tput setf 4; echo hi. Isso obterá o setfrecurso terminfo e passará a ele um parâmetro 4, que é a cor que você deseja.


Por que o terminal gnome está sobre si mesmo:

Agora, digamos que você tenha algum novo emulador de terminal recém-lançado, e a biblioteca terminfo do sistema ainda não possui uma definição para ele. Quando seu aplicativo procurar informações sobre como fazer algo, ele falhará porque o terminal não é conhecido.

A maneira como o seu terminal contorna isso é mentir sobre quem é. Então seu terminal gnome está dizendo " I'm xterm ".

O Xterm é um terminal muito básico que existe desde o início do X11 e, portanto, a maioria dos emuladores de terminal suporta o que ele suporta. Então, pelo terminal gnome dizendo que é um xterm, é mais provável que tenha uma definição na biblioteca terminfo.

A desvantagem de mentir sobre o seu tipo de terminal é que o terminal pode realmente suportar muito mais do que o xterm (por exemplo, muitos terminais novos suportam 256 cores, enquanto os terminais mais antigos suportam apenas 16). Então você tem uma troca, obtém mais recursos ou tem mais compatibilidade. A maioria dos terminais optará por mais compatibilidade e, assim, escolherá se anunciar como xterm.

Se você deseja substituir isso, muitos terminais oferecerão uma maneira de configurar o comportamento. Mas você também pode fazer export TERM=gnome-terminal.

Patrick
fonte
4
Recomendando alguém exportação $ TERM realmente parece como esfregar sal em uma ferida aberta ...
jasonwryan
11
sim. Eu estou supondo que os desenvolvedores do gnome-terminal esquerdo $TERMdefinido para xtermpor um bom motivo
mulllhausen
4
@mulllhausen que a razão é bem explicado na minha resposta ...
Patrick
27

A TERMvariável de ambiente indica o tipo de terminal , não a aplicação do terminal . TERMtem um propósito específico: informa aos aplicativos em execução nesse terminal como interagir com o terminal.

Os aplicativos interagem com os terminais escrevendo sequências de escape - sequências de caracteres que incluem caracteres não imprimíveis e têm efeitos como mover o cursor, apagar parte da tela, alterar a cor atual etc. Nos velhos tempos, diferentes marcas de terminais físicos tinham diferentes conjuntos de seqüências de escape. Portanto, o sistema operacional mantém um banco de dados de tipos de terminais e suas características. O banco de dados tradicional é termcap ("TERMinal CAPabilities"); muitos sistemas e aplicativos modernos mudaram para terminfo . Ambos os bancos de dados são indexados pelo nome do tipo de terminal e os aplicativos os consultam usando o nome do tipo de terminal nas TERMvariáveis ​​de ambiente.

Atualmente, a maioria dos terminais usa um conjunto padrão de seqüências de escape com alguns conjuntos comuns de extensões, portanto você não verá muitos valores diferentes de TERM. A maioria dos emuladores de terminal da GUI é compatível com o xterm , o tradicional terminal X (que ainda é usado e mantido).

Os emuladores de terminal diferentes do xterm podem adicionar sua própria entrada ao banco de dados do terminal com seu próprio nome. No entanto, isso não combina bem com conchas remotas. Um programa em execução na máquina A, mas exibido na máquina B, por exemplo, porque foi iniciado pelo ssh de B para A, precisa consultar o banco de dados do terminal na máquina A. Os métodos de login remoto, como ssh, carregam a TERMvariável de ambiente, mas isso é útil somente quando o banco de dados do terminal de B também possui uma entrada para o valor do usuário em A. Portanto, muitos emuladores de terminal mantêm o TERM=xtermque é conhecido universalmente.

A diferenciação entre terminais em geral não vem da maneira como os aplicativos interagem com eles, mas da maneira como os terminais interagem com o usuário e se ajustam ao seu ambiente. Por exemplo, o Gnome Terminal fica bem no Gnome e fornece guias e outras informações; O Konsole fica bem no KDE e fornece abas e outros detalhes; O urxvt possui um pequeno requisito de memória; Console2 é executado no Windows; screen e tmux fornecem sessões que podem ser conectadas a diferentes terminais pais; e assim por diante. Como nenhum desses recursos faz diferença nos aplicativos em execução no terminal, a maioria dos emuladores de terminal usa TERM=xterm.

Para descobrir qual terminal um shell está executando, veja o pai do shell:

ps -p$PPID
Gilles 'SO- parar de ser mau'
fonte
Correr ps -p$PPIDnão parece me dizer qual terminal estou executando. Ou pelo menos não de uma maneira que eu entenda. Você tem um exemplo de saída / resposta?
user3731622
@user A saída é um monte de números e abreviações enigmáticas seguidas por uma linha de comando. Na maioria das circunstâncias, a linha de comando é a que iniciou o emulador de terminal no qual o shell está sendo executado.
Gilles 'SO- stop be evil'
12

A variável de ambiente TERM não significa o terminal que você está usando.

Citando gnu.org :

A variável de ambiente TERM contém um identificador para os recursos da janela de texto. Você pode obter uma lista detalhada dessas capacidades usando o comando> 'infocmp', usando 'man 5 terminfo' como referência.

Ao produzir texto com diretivas de cores incorporadas, o msgcat analisa a variável TERM. Atualmente, as janelas de texto suportam pelo menos 8 cores. Muitas vezes, no entanto, a janela de texto suporta 16 ou mais cores, mesmo que a variável TERM esteja definida como um identificador que denota apenas 8 cores suportadas. Pode valer a pena definir a variável TERM para um valor diferente nesses casos:

Na maioria dos casos, o xterm é construído com suporte para 16 cores. Também pode ser construído com suporte para 88 ou 256 cores (mas não ambas). Você pode tentar definir TERM para xterm-16color, xterm-88color ou xterm-256color. rxvt

O rxvt geralmente é construído com suporte para 16 cores. Você pode tentar definir TERM para rxvt-16color. konsole

O konsole também costuma ser construído com suporte para 16 cores. Você pode tentar definir TERM como konsole-16color ou xterm-16color.

Após definir TERM, você pode verificá-lo invocando 'msgcat --color = test' e verificando se a saída se parece com um mapa de cores razoável. A variável de ambiente TERM contém um identificador para os recursos da janela de texto. Você pode obter uma lista detalhada dessas capacidades usando o comando 'infocmp', usando 'man 5 terminfo' como referência.

mavillan
fonte