Endings de linha ao usar o GNU Screen

5

Estou vendo um comportamento um pouco estranho ao usar o GNU Screen 4.00.03 em um sistema Red Hat Enterprise Linux 6.4.

Se eu conectar sem Tela, observando os logs, posso ver que cada linha é terminada com CRLF ( 0x0D 0x0A ), exatamente como esperado.

Se eu conectar e executar a Tela, as linhas com dois ou mais caracteres serão encerradas com o CRLF conforme o esperado. As linhas sem caracteres impressos (por exemplo, da execução de echo ) são terminadas apenas com LF ( 0x0A ) e, o mais bizarro de tudo, linhas com um único caractere impresso (por exemplo, echo x ) são finalizadas com BSLF ( 0x08 0x0A ).

Estou vendo isso com o PuTTY, e os logs acima são de logs do PuTTY. Eu também estou vendo isso com frameworks Python automatizados usando o Pexpect, então eu não estou culpando o PuTTY por isso.

O que está acontecendo? Como eu paro isso?

    
por me_and 17.05.2013 / 15:31

1 resposta

7

Essa é uma otimização feita por screen .

Quando você digita echo<Cr> em screen . Devido ao eco local e às configurações icrnl e onlcr do dispositivo pseudo-terminal na janela screen , a sequência \r\n é enviada para o lado mestre (para a tela).

screen implementa um emulador de terminal no qual \r serve para colocar o cursor no início da linha e \n para mover o cursor para baixo. Para fazer isso, onde um emulador de terminal como o xterm faria chamadas de API X para mover o cursor para o início da linha, screen tem que enviar códigos de escape para os terminais de host aos quais ele está conectado para informar cursor para o lado esquerdo da janela da tela.

Caso você divida a janela verticalmente, isso significa enviar sequências de escape de posicionamento do cursor para onde quer que o lado esquerdo das janelas da tela esteja. Se não estiver ou no lado esquerdo do terminal do host, screen passaria esses caracteres \r e \n para que o cursor fosse movido para o início da linha e uma linha para baixo no terminal host também (já que todos os terminais tratam \r e \n o mesmo nessa instância).

Agora, echo é executado e gera um caractere \n . Por causa de onlcr novamente na janela screen tty, screen recebe \r\n novamente. \r diz para ir para o início da linha, mas o cursor já está no início da linha, portanto não é necessário fazer nada, e é por isso que o terminal do host não recebe um segundo caractere \r . Em seguida, para mover o cursor para baixo por causa do \n que ele recebe, screen envia \n para o terminal host.

Você pode verificar isso executando na tela:

printf '\r\r\r\r'

Você notará que screen envia apenas um % caractere\r para seu terminal host.

    
por 17.05.2013 / 16:17