Onde a variável de ambiente TERM padrão é definida?

26

Quando abro uma janela de terminal com o emulador de Terminal GNOME na GUI da área de trabalho, a variável de ambiente TERM do shell é padronizada com o valor xterm.

Se eu usar CTL+ ALT+ F1para alternar para uma janela TTY do console e echo $TERMo valor estiver definido como linux.

Minha motivação para perguntar é que, dentro do meu ~/.bashrcarquivo, uma variável é usada para determinar se um shell de cor é fornecido ou apenas o monocromático antiquado.

# set a fancy prompt (non-color, unless we know we "want" color)
case "$TERM" in
    xterm-color) color_prompt=yes;;
esac

No shell do console e no emulador do Gnome Terminal, se eu digitar

export TERM=xterm-color
source /.bashrc

as duas conchas mudam para o modo de cor (algo que eu gostaria que acontecesse sempre nas duas).

Onde os TERMvalores padrão são definidos, por favor, e onde é o melhor local para alterar os padrões, se possível? Parece não haver nada na GUI do emulador de terminal para selecionar ou definir o valor TERM padrão.

Eu considerei apenas adicionar a linha export TERM=xterm-colorao topo do meu ~/.bashrcarquivo, mas meu instinto diz que essa não é a melhor solução e minhas pesquisas no Google ainda não me levaram a uma boa resposta.

Estou executando o Ubuntu 15.04 Desktop Edition (baseado em Debian).

Andy Fusniak
fonte

Respostas:

17

Em muitos lugares, dependendo

Em terminais virtuais e terminais reais, a TERMvariável de ambiente é configurada pelo programa que é encadeado logine é herdada por todo o caminho até o shell interativo que é executado quando o usuário faz logon. Onde, precisamente, isso acontece varia de sistema para sistema e de acordo com o tipo de terminal.

Os terminais reais, seriais, podem variar em tipo, de acordo com o que está na outra extremidade do fio. Portanto, convencionalmente, o gettyprograma é chamado com um argumento que especifica o tipo de terminal ou é transmitido ao TERMprograma a partir dos dados de configuração de serviço de um gerente de serviço.

  • Nos initsistemas van Smoorenburg , pode-se ver isso nas /etc/inittabentradas, que lerão algo ao longo das linhas de

    S0: 3: respawn: / sbin / agetty ttyS0 9600 vt100-nav
    O último argumento agettynessa linha,, vt100-navé o tipo de terminal definido para /dev/ttyS0. Então /etc/inittabé onde mudar o tipo de terminal para terminais reais em tais sistemas.
  • Nos sistemas systemd, é possível ver isso no /usr/lib/systemd/system/[email protected]arquivo da unidade ( /lib/systemd/system/[email protected]em sistemas não mesclados), que lê

    Ambiente = TERM = vt100
    definindo a TERMvariável no ambiente passado para agetty. Esse arquivo de unidade de serviço é onde alterar o tipo de terminal para terminais reais nesses sistemas. Observe que isso se aplica a todos os terminais reais que empregam esse modelo de unidade de serviço. (Para alterá-lo apenas para terminais individuais, é necessário instanciar manualmente o modelo.)
  • Nos BSDs, initpega o tipo de terminal no terceiro campo da entrada de cada terminal no /etc/ttysbanco de dados e define TERMno ambiente em que é executado getty. Assim /etc/ttysé onde se muda o tipo de terminal para terminais reais nos BSDs.

Os terminais virtuais do kernel, como você observou, têm um tipo fixo. Diferentemente do NetBSD, que pode variar rapidamente o tipo de terminal virtual do kernel, o Linux e os outros BSDs têm um único tipo de terminal fixo implementado no programa de emulação de terminal interno do kernel. No Linux, esse tipo corresponde linuxao banco de dados terminfo. (A emulação de terminal do kernel do FreeBSD é um xtermsubconjunto limitado desde a versão 9.)

  • Em sistemas que usam mingettyou vc-get-tty(do pacote nosh), o programa "sabe" que ele só pode estar conversando com um terminal virtual e conectam os tipos de terminal virtual "conhecidos" apropriados ao sistema operacional para o qual o programa foi compilado.
  • Nos sistemas systemd, é possível ver isso no /usr/lib/systemd/system/[email protected]arquivo da unidade ( /lib/systemd/system/[email protected]em sistemas não mesclados), que lê

    Ambiente = TERM = linux
    definindo a TERMvariável no ambiente passado para agetty.

Para terminais virtuais do kernel, não se altera o tipo de terminal. O programa emulador de terminal no kernel não muda, afinal. É incorreto alterar o tipo. Em particular, isso estragará o reconhecimento de sequência CSI da tecla cursor / edição. As linuxseqüências CSI enviados pelo emulador de terminal do kernel Linux são diferentes dos xtermou vt100seqüências CSI enviados por programas de emulador de terminal GUI no modo VT DEC.

O emulador de terminal da GUI é um dos muitos programas, do daemon SSH ao screen, que usa pseudo-terminais. Qual é o tipo de terminal depende de qual programa emulador de terminal está sendo executado no lado principal do pseudo-terminal e como ele está configurado. A maioria dos emuladores de terminal da GUI inicia o programa no lado escravo com uma TERMvariável cujo valor corresponde à emulação do terminal no lado mestre. Programas como o servidor SSH tentarão "passar" pelo tipo de terminal localizado na extremidade do cliente da conexão. Geralmente, há algum menu ou opção de configuração para escolher entre emulações de terminal.

A mão emocionante

A maneira correta de detectar a capacidade de cores não é conectar uma lista de tipos de terminais em seu script. Existem muitos tipos de terminais compatíveis com cores.

O caminho certo é observar o que termcap / terminfo diz sobre o seu tipo de terminal.

color = 0
se tput Co> / dev / null 2> & 1
então
    teste "` tput Co` "-gt 2 && color = 1
cores elif tput> / dev / null 2> & 1
então
    teste "` cores de saída` "-gt 2 && color = 1
fi

Leitura adicional

  • Jonathan de Boyne Pollard (2018). TERM. Guia nosh . Softwares.
JdeBP
fonte
A seguir existe no .bashrc padrão no Debian Jessie: [ -x /usr/bin/tput ] && /usr/bin/tput setaf 1 >&/dev/null && color_prompt=yes. (ncurses 5.9)
thom_nic 16/03
2
Também tput Coretorna "capacidade terminfo desconhecida" em Jessie e Xenial. tput colorse tput setaf 1ambos parecem funcionar, embora eu admita que não entendo o porquê .
22417 thh_nic
2

Por favor, consulte /ubuntu//a/614714/398785 para obter minha resposta detalhada sobre por que eu acho que TERM=xterm-coloré a abordagem errada e a do Ubuntu .bashrcé obsoleta. Eu recomendo que você vá com TERM=xterm-256color(que é o padrão desde o gnome-terminal 3.16, mas também é seguro para uso com os terminais gnome-antigos) e ajuste-o de .bashrcacordo.

Egmont
fonte
1
+1 para o seu link. Sugestão menor; a frase a seguir pode ser confusa (tive a impressão de que você estava dizendo que o uso .bashrcé obsoleto). "O .bashrc do Ubuntu é obsoleto."
IsaacS
@IsaacS Você tem alguma sugestão de como melhorá-lo? Por exemplo, substituiria "obsoleto" por ajuda "desatualizada"?
egmont
1
Parece que isso xterm-256colorcausa htopuma bagunça no seu layout como este no Ubuntu 18.04.
Pare de prejudicar Monica
@ OrangeDog Em qual terminal emulador? Esta pergunta aqui e, portanto, minha resposta se concentra no Terminal GNOME, enquanto a página que você vinculou mostra o Konsole. O bug parece que o emulador de terminal ainda não suporta a sequência de escape REP que ncurses começaram a usar nesse período. O VTE (Terminal GNOME) já havia adicionado suporte a ele no Ubuntu 18.04, é provável que o Konsole não tivesse. Suspeito que seu comentário com a quebra do htop seja válido para o Konsole, mas não para o Terminal GNOME.
egmont 9/01
O @egmont não pode falar pelo problema original, mas eu recebo o mesmo resultado com o terminal da WSL (seja lá o que for).
Pare de prejudicar Monica