Pré-requisitos
O terminal virtual Linux (tty) é uma emulação de VT102 - Origem do subsistema de terminal virtual.
O VT100 real (quase o mesmo que VT102 ) tem o seguinte comportamento (suponho):
- No modo LINE , todos os caracteres digitados são transmitidos primeiro ao computador e, em seguida, retornados ao terminal. Nada é exibido na tela do terminal antes de retornar do host.
- As sequências de escape não são exceção - elas são analisadas e executadas somente após retornar do host. Ou seja, se eu quiser mudar a cor da fonte para vermelho, devo digitar
ESC[0;31m
, essa sequência vai para o computador, ecoa de volta, o VT102 recebe isso, analisa e aplica. Não há outra maneira de alterar a cor da fonte do terminal (no modo LINE ). Não tenho certeza se o VT102 tinha cores de fonte diferentes, mas isso é um exemplo.
Imagem do manual:
Extraído do manual:
LINHA/LOCAL
O recurso LINE/LOCAL permite que o operador coloque facilmente o terminal em uma condição ON-LINE ou LOCAL (off-line). Quando o terminal está on-line (o indicador ON-LINE está aceso) todos os caracteres digitados no teclado são enviados diretamente para o computador e as mensagens do computador são exibidas na tela. Na condição LOCAL (o indicador LOCAL está aceso), o terminal está desconectado eletricamente do computador; as mensagens não são enviadas ou recebidas do computador; e os caracteres digitados no teclado são reproduzidos diretamente na tela.
Fonte: Manual técnico do terminal de vídeo da série VT100, terceira edição, julho de 1982.
A questão
Por que o Linux tty
se comporta de maneira diferente?
Eu coloco bash
no modo de suspensão, para que não interfira, digite Esc[0;31m
e obtenha apenas texto simples, a cor não mudou - então, a sequência de escape não tem efeito.
Eu fiz a pergunta semelhante há alguns anos - Por que não posso enviar sequências de escape do teclado, mas posso fazê-lo de outro tty? , mas agora eu tenho o conhecimento sobre o subsistema Linux VT102 e quero entender por que ele funciona dessa maneira - não de forma idêntica ao terminal de hardware real nesse aspecto.
Em primeiro lugar, esta pergunta foi feita em Retrocomputing , mas a comunidade achou mais adequada para este site. Mas eu obtive uma resposta na seção de comentários, então copie aqui:
Eu tentei
stty -ctlecho
e funciona quase como esperado - apenas uma subquestão - o VT102 real também não estava exibindo caracteres após a pessoa pressionar ESCe iniciar a sequência de escape do tipo, então a pessoa digitou de maneira cega?Pergunta longa, reduzida a
Na verdade, não é o tty , mas o aplicativo (como seu shell ) que controla o que e como os caracteres são ecoados. Você pode usar o
stty
aplicativo para alterar o modo do terminal temporariamente (alguns shells o alterarão de volta), por exemplo,(tornando-o "cru", dizendo ao driver do terminal para não interferir).
Estamos chegando perto, eu acho. Você fez uma documentação muito legal. Só faltou a demo! No seu antigo Q send-escape-sequences-from-keyboard você só mostra o que NÃO funciona! E os dois títulos??? Você não pode deixar isso mais claro? E uma captura de tela como a minha (na minha resposta ao Q vinculado acima)
Ninguém deveria entrar cegamente em uma dessas longas seqüências . Em um VTxxx bem configurado, você teria teclas especiais e ligações especiais, talvez funções de shell, onde os CSs são armazenados. Em um sistema como esse, tudo é coordenado. Linux e xterm estão emulando porque é a única coisa que se aproxima de um padrão.
Mas sim, a tecla Escape significa: a próxima tecla não é entrada, mas um comando. Então, alguém tem que começar a reter os bytes e verificar uma sequência predefinida.
Mas se a sequência ficar impossível, o shell sai do modo Escape e começa a ecoar novamente. Pressione Escape, [, então 1,1,1... e o colchete e dois "1" se perdem.
Tente entrar
[32m
depois de um Escape... o "m" reaparece novamente, o que significa que o shell desistiu dessa sequência. O inútil ^[[32 está perdido, devo dizer, em algum lugar.Acabe com o bash/readline, tire o tty do trabalho: você ficará apenas com um brinquedo de criança onde você pode colocar letras coloridas (negrito, sublinhado, piscando, invisível) por toda a tela.
Não entendo sua pergunta. Uma " sequência de escape ecoada " é para mim uma que não chegou ao alvo e realmente foi refletida. Como quando tento usar a seta para a esquerda no prompt de leitura (depois de digitar abc):
No prompt normal, quando digito "abc", depois Escape e, às cegas, "[D" o cursor se move para a esquerda. A tecla de seta é apenas uma maneira mais fácil de gerar isso.
Para obter suas sequências, use
echo -e '\e...'
ouecho '^[...'
(com ctrl-V). Dessa forma, o shell envia o escape e não o interpreta (cozinha?).E com
stty -echoctl
esleep 1000
você até descobriu uma maneira de jogar um CS diretamente na cara de tty. Desculpe: a cara do motorista do tty .[aqui eu preciso de um jpeg de mudança de cor ainda melhor enquanto-bash-está-dormindo-e-tty-offguard...]