AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 518418
Accepted
MiniMax
MiniMax
Asked: 2019-05-11 14:04:26 +0800 CST2019-05-11 14:04:26 +0800 CST 2019-05-11 14:04:26 +0800 CST

Sequências de escape ecoadas não são interpretadas no Linux tty

  • 772

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:

insira a descrição da imagem aqui

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 ttyse comporta de maneira diferente?

Eu coloco bashno modo de suspensão, para que não interfira, digite Esc[0;31me obtenha apenas texto simples, a cor não mudou - então, a sequência de escape não tem efeito.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

linux tty
  • 3 3 respostas
  • 1754 Views

3 respostas

  • Voted
  1. Best Answer
    MiniMax
    2019-05-12T06:31:28+08:002019-05-12T06:31:28+08:00

    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:

    O console virtual Linux emula um terminal VT102 (mais ou menos) no modo ON-LINE conectado a um dispositivo tty Linux (serial). O driver tty do Linux normalmente não ecoa de volta o caractere de controle de escape e, em vez disso, ecoa ^[ . Se você não quiser que o driver tty faça isso, use stty -ctlecho . Também os terminais VT102 reais não suportam cores, ele funciona com o console virtual Linux de qualquer maneira porque não é realmente compatível com VT102.

    Eu tentei stty -ctlechoe 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?

    • 4
  2. Thomas Dickey
    2019-05-12T06:30:33+08:002019-05-12T06:30:33+08:00

    Pergunta longa, reduzida a

    Por que o Linux tty se comporta de maneira diferente?

    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 sttyaplicativo para alterar o modo do terminal temporariamente (alguns shells o alterarão de volta), por exemplo,

    stty -cooked
    

    (tornando-o "cru", dizendo ao driver do terminal para não interferir).

    • 1
  3. user370539
    2019-09-13T10:18:50+08:002019-09-13T10:18:50+08:00

    ... digite-o às cegas

    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 [32mdepois 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):

    $  read
    abc^[[D
    

    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...'ou echo '^[...'(com ctrl-V). Dessa forma, o shell envia o escape e não o interpreta (cozinha?).

    E com stty -echoctle sleep 1000você 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...]

    • 0

relate perguntas

  • Existe uma maneira de fazer ls mostrar arquivos ocultos apenas para determinados diretórios?

  • Inicie/pare o serviço systemd usando o atalho de teclado [fechado]

  • Necessidade de algumas chamadas de sistema

  • astyle não altera a formatação do arquivo de origem

  • Passe o sistema de arquivos raiz por rótulo para o kernel do Linux

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve