Onde o padrão da variável de ambiente TERM é definido?

17

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

Se eu usar CTL + ALT + F1 para mudar para uma janela TTY do console e echo $TERM o valor é definido para linux .

Minha motivação para perguntar é que, dentro do meu arquivo ~/.bashrc , uma variável é usada para determinar se um shell de cores é fornecido ou apenas um bom monocromático antigo.

# 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 shell do emulador de terminal do Gnome, se eu digitar

export TERM=xterm-color
source /.bashrc

ambos os shells mudam para o modo de cor (algo que eu gostaria que acontecesse sempre em ambos).

Onde os valores padrão TERM são definidos e qual é o melhor lugar para alterar seus 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-color ao topo do meu arquivo ~/.bashrc , 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 no Debian).

    
por Andy Fusniak 27.04.2015 / 07:36

2 respostas

12

Em muitos lugares, dependendo

Em terminais virtuais e terminais reais, a variável de ambiente TERM é definida pelo programa que é vinculado a login e é herdada desde o início até o shell interativo que é executado depois que você efetua o logon. Onde, precisamente, isso acontece, varia de sistema para sistema e de acordo com o tipo de terminal.

Terminais reais, seriais podem variar em tipo, de acordo com o que está na outra extremidade do fio. Então convencionalmente o programa getty é invocado com um argumento que especifica o tipo de terminal, ou é passado o programa TERM dos dados de configuração de serviço do gerenciador de serviço.

  • No sistema 5 init systems, pode-se ver isso em /etc/inittab entradas, o que vai ler algo nos moldes de

    S0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
    O último argumento para agetty nessa linha, vt100-nav , é o tipo de terminal definido para /dev/ttyS0 . Portanto, /etc/inittab é onde alterar o tipo de terminal para terminais reais em tais sistemas.
  • Em sistemas systemd, pode-se ver isso no arquivo /usr/lib/systemd/system/[email protected] unit ( /lib/systemd/system/[email protected] em sistemas não mesclados), que lê

    Environment=TERM=vt100
    definindo a variável TERM no ambiente passado para agetty . Este arquivo de unidade de serviço é onde alterar o tipo de terminal para terminais reais em tais 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, init aceita o tipo de terminal do terceiro campo da entrada de cada terminal no banco de dados /etc/ttys e define TERM a partir do ambiente em que executa getty com. Portanto, /etc/ttys é onde um altera o tipo de terminal para terminais reais nos BSDs.

Os terminais virtuais do Kernel, como você observou, têm um tipo fixo. Ao contrário do NetBSD, que pode variar o tipo de terminal virtual do kernel em tempo real, o Linux e os outros BSDs possuem um único tipo de terminal fixo implementado no programa de emulação de terminal embutido do kernel. No Linux, esse tipo corresponde a linux do banco de dados terminfo. (A emulação do terminal do kernel do FreeBSD é um subconjunto limitado de xterm desde a versão 9.)

  • Em sistemas que usam mingetty ou vc-get-tty (do pacote nosh), o programa "sabe" que só pode estar falando com um terminal virtual e codifica os tipos de terminal virtual "conhecidos" apropriados ao sistema operacional que o programa foi compilado para.
  • Em sistemas systemd, pode-se ver isso no arquivo /usr/lib/systemd/system/[email protected] unit ( /lib/systemd/system/[email protected] em sistemas não mesclados), que lê

    Environment=TERM=linux
    definindo a variável TERM no ambiente passado para agetty .

Para terminais virtuais do kernel, um não altera o tipo de terminal. O programa emulador de terminal no kernel não muda, afinal. Está incorreto para alterar o tipo. Em particular, isso estraga o cursor / edição da chave do reconhecimento da seqüência CSI. As sequências linux CSI enviadas pelo emulador de terminal do kernel Linux são diferentes das sequências xterm ou vt100 CSI enviadas pelos programas emuladores de terminal GUI no modo DEC VT.

Seu emulador de terminal GUI é um dos muitos programas, desde o daemon SSH até screen , que usa pseudo-terminais. O tipo de terminal depende do programa emulador de terminal que está sendo executado no lado mestre do pseudo-terminal e de como ele é configurado. A maioria dos emuladores de terminal GUI iniciarão o programa no lado escravo com uma variável TERM , cujo valor corresponde à sua emulação de terminal no lado mestre. Programas como o servidor SSH tentam "passar" pelo tipo de terminal que está no lado 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

O caminho certo para detectar a capacidade de cores é não para criar uma lista de tipos de terminais em seu script. Existem muitos tipos de terminais que suportam cores.

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

colour=0
if tput Co > /dev/null 2>&1
then
    test "'tput Co'" -gt 2 && colour=1
elif tput colors > /dev/null 2>&1
then
    test "'tput colors'" -gt 2 && colour=1
fi
    
por 27.04.2015 / 19:10
2

Por favor, veja link para minha resposta detalhada sobre porque eu acho que TERM=xterm-color é a abordagem errada e .bashrc do Ubuntu é obsoleto. Eu recomendo que você vá com TERM=xterm-256color (que é o padrão desde o gnome-terminal 3.16, mas também seguro para usar com terminais gnome mais antigos), e ajuste seu .bashrc de acordo.

    
por 27.04.2015 / 18:47