Os programas de console normalmente usam maldições ou um de seus sucessores¹ para criar os tipos de interfaces de usuário de texto de que você está falando.
Essas bibliotecas usam um dos dois bancos de dados, chamados termcap
e terminfo
.² Esses bancos de dados contêm mapas que informam à biblioteca quais códigos enviar para obter as ações desejadas com um grande número de tipos de terminais diversos. A grande maioria dos tipos de terminal que você encontrará definidos nesses bancos de dados não sobreviveu aos dias dos terminais reais e agora são de interesse histórico.
Terminais ANSI
Os modernos emuladores de terminal Unix³ usam o protocolo ANSI X3.64 ou uma de suas variantes posteriores:
ANSI X3.64 : um padrão para controlar "terminais de vidro" - ao contrário de teletipos - é baseado em seqüências especiais de caracteres que o terminal remoto interpreta. Por exemplo, se a caixa Unix quiser dizer a um terminal compatível com ANSI X3.64 para mover o cursor para o canto superior esquerdo da tela, ele enviará os caracteresESC
[
1
;
1
H
. Os dois primeiros caracteres dizem ao terminal para esperar uma sequência de controle, os 1s são a linha e a coluna eH
é o comando que significa "mover o cursor" .⁴
Curiosidades: muitos BBSs de PC também usavam códigos ANSI. ( Ainda sim , na verdade.)
DEC VT100 : O primeiro terminal de vidro compatível com ANSI realmente popular foi o VT100 da Digital Equipment Corporation. Ao provar o padrão de jure da ANSI no mercado, ele estabeleceu um padrão de fato que ainda é importante hoje.
Às vezes, você vê isso chamado protocolo VT102, que é uma versão mais tarde reduzida em custo - e, portanto, mais popular - do VT100, além de todas as opções de expansão disponíveis.
Os protocolos de terminal DEC são uma série compatível com versões anteriores, que se estendem desde o primeiro modelo compatível com ANSI introduzido em 1978 (o VT100) até os modelos da série VT500 produzidos pela Boundless Technologies após a compra do negócio de terminais da DEC em 1995. (A Boundless é agora estão fora do mercado, mas seus terminais ainda aparecem no mercado usado de tempos em tempos.)
xterm : Um tipo de amálgama de ANSI e VT, qualquer que seja o padrão. Sempre que você estiver usando um emulador de terminal da GUI comoxterm
ou um de seus derivados, normalmente também estará usando oxterm
protocolodoterminal, normalmente o mais modernoxterm-color
ou asxterm-color256
variantes.
Linux : o console do Linux também usa uma variante estendida do protocolo do terminal ANSI, no mesmo espírito que osxterm
protocolos. A maioria de suas extensões tem a ver com as diferenças entre um PC e um terminal de vidro. Por exemplo, o teclado IBM possui algumas teclas que não estão no DEC VT, seja qual for. (E vice versa.)
Alguns sistemas Unix também têm seu próprio protocolo de terminal de console. Existe a scoansi
variante ANSI X3.64 para os SCO Unixes, por exemplo.
Um programa típico de emulador de terminal é uma espécie de vira-lata e não emula exatamente nenhum modelo de terminal. Ele pode suportar 96% de todas as seqüências de escape do DEC VT no VT320, mas também suporta extensões como a cor ANSI (um recurso do VT525) e um número arbitrário de linhas e colunas. Os 4% de códigos que ele não entende podem não ser perdidos se seus programas não precisarem desses recursos, mesmo que você tenha dito curses
(ou o que seja) que deseja que os programas o usem para usar o protocolo VT320. Esse programa pode se anunciar como compatível com o VT320 e, mesmo que, estritamente falando, não seja.⁵
Terminais não-ANSI
Existem alguns outros padrões notáveis que você ainda encontra:
Wyse : Uma das primeiras produtoras independentes de terminais de vidro, a Wyse começou a fabricar terminais no início dos anos 80, antes de a computação das estações de trabalho começar a substituir os minicomputadores. Embora os terminais Wyse pudessem emular o VT100 e outros protocolos populares, eles também tinham seus próprios códigos nativos.
IBM 3270 : Embora este não seja estritamente um tipo de terminal "Unix", a necessidade de conectar sistemas Unix aos mainframes IBM levou à criação de programas emuladores de terminal IBM 3270 series, que você ainda pode encontrar em uso. Os emuladores para osterminais da série IBM 5250 posteriorestambém são bastante comuns, usados com mais freqüência atualmente para conectar-se aosminicomputadores AS / 400 e System i .
Tektronix 4014 : Antes dos PCs e estações de trabalho deslocarem largamente os terminais de vidro e, assim, tornarem os gráficos de bitmap um recurso padrão, havia terminais gráficos caros que desenhavam gráficos na tela em resposta a comandos de texto semelhantes às seqüências de escape descritas acima. Provavelmente a mais popular delas foi a série Tektronix 4010.
Eles foram muito divertidos de usar. Você poderia escrever um programa que desenhasse um gráfico, mas, em vez de simplesmente executá-lo para desenhar no terminal local, poderia redirecionar sua saída para um arquivo:
$ ./my4014program > my-neat-graphic
Você poderia então enviar esse arquivo para outra pessoa, e eles poderiam cat
fazê-lo no terminal Tek para ver o gráfico sem ter o seu programa. Parte do charme era a lentidão desses terminais no desenho, para que você pudesse observar o gráfico se acumular durante vários segundos.
Trabalhando com a emulação de terminal Unix hoje
Você pode descobrir qual padrão de terminal você está pedindo para as bibliotecas curses
usarem olhando a TERM
variável de ambiente:
$ echo $TERM
xterm-color
Quando você ssh
viaja para outro sistema, a TERM
variável é transportada para que a caixa remota do Unix saiba como se comunicar com o terminal local.
Como muitos desses protocolos são variantes do ANSI X3.64 e como os onipresentes padrões de codificação de caracteres ASCII e UTF-8 cuidam de muitas outras coisas, uma TERM
variável incorreta normalmente não é catastrófica. As coisas que tendem a quebrar são as teclas estendidas, como Home e Page Up, Alt, qualquer combinação de teclas e recursos tipográficos de exibição, como cores, negrito, etc.
Notas de rodapé:
Mais comumente, ncurses .
Também existem concorrentes diretos para a curses
API, como o S-Lang .
A AT&T foi promulgada terminfo
como um substituto para o termcap
banco de dados do BSD e teve grande êxito em substituí-lo, mas ainda existem programas por aí que ainda usam o termcap
banco de dados antigo . É uma das muitas diferenças entre BSD e AT&T que você ainda encontra nos sistemas modernos.
Minha caixa do macOS não possui /etc/termcap
, mas possui /usr/share/terminfo
, enquanto uma instalação padrão do FreeBSD é o contrário, mesmo que esses dois sistemas operacionais sejam bastante semelhantes no nível da linha de comando.
minicom
, xterm
, mintty
, O Terminal GNOME , Terminal.app , etc.
Programas Unix escritos corretamente não emitem essas seqüências de escape diretamente. Em vez disso, eles usam uma das bibliotecas mencionadas acima, dizendo para "mover o cursor para a posição (1,1)" ou o que for, e a biblioteca emite os códigos de controle de terminal necessários com base na TERM
configuração da variável de ambiente. Isso permite que o programa funcione corretamente, independentemente do tipo de terminal em que você o executa.
Os terminais de texto antigos tinham muitos recursos estranhos que não eram muito utilizados pelos programas; portanto, muitos programas populares de emulador de terminal simplesmente não implementam esses recursos. Omissões comuns são compatíveis com gráficos sixel e modos de texto com largura dupla / altura dupla.
O mantenedor de xterm
escreveu um programa chamado vttest
para testar emuladores de terminal VT como xterm
. Você pode executá-lo em outros emuladores de terminal para descobrir quais recursos eles não suportam.