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 deS0:3:respawn:/sbin/agetty ttyS0 9600 vt100-nav
O último argumento paraagetty
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ávelTERM
no ambiente passado paraagetty
. 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 defineTERM
a partir do ambiente em que executagetty
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
ouvc-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ávelTERM
no ambiente passado paraagetty
.
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