Qual protocolo / padrão é usado pelos terminais?

25

Eu queria saber como a "GUI" de um aplicativo de linha de comando é comunicada através de uma rede. Na maioria das vezes, é bastante simples (texto simples / entrada), mas às vezes é mais complexo (aptidão).

É definido por algum tipo de padrão para que qualquer pessoa possa escrever seu próprio terminal e que todas as implementações de terminal se comportem da mesma maneira (cores, posicionamento etc.)?

Olivier Lalonde
fonte

Respostas:

46

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 termcape 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 comoxtermou um de seus derivados, normalmente também estará usando oxtermprotocolodoterminal, normalmente o mais modernoxterm-colorou asxterm-color256variantes.

  • Linux : o console do Linux também usa uma variante estendida do protocolo do terminal ANSI, no mesmo espírito que osxtermprotocolos. 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 scoansivariante 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 catfazê-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 cursesusarem olhando a TERMvariável de ambiente:

$ echo $TERM
xterm-color

Quando você sshviaja para outro sistema, a TERMvariá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 TERMvariá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é:

  1. Mais comumente, ncurses .

    Também existem concorrentes diretos para a cursesAPI, como o S-Lang .

  2. A AT&T foi promulgada terminfocomo um substituto para o termcapbanco de dados do BSD e teve grande êxito em substituí-lo, mas ainda existem programas por aí que ainda usam o termcapbanco 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.

  3. minicom, xterm, mintty, O Terminal GNOME , Terminal.app , etc.

  4. 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 TERMconfiguração da variável de ambiente. Isso permite que o programa funcione corretamente, independentemente do tipo de terminal em que você o executa.

  5. 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 xtermescreveu um programa chamado vttestpara testar emuladores de terminal VT como xterm. Você pode executá-lo em outros emuladores de terminal para descobrir quais recursos eles não suportam.

Warren Young
fonte