Por que o retorno de carro é mal tratado nos redirecionamentos?

2

Vamos ter o seguinte código (aqui em python):

print("something\r any")

Ao executá-lo em um console, isso produzirá corretamente:

 anything

(depois de imprimir something , o cursor retorna ao início da mesma linha e sobrescreve os primeiros quatro caracteres com any )

No entanto, o mesmo comando em um redirecionamento produzirá:

something
 any

que está incorreto. Por que é tão ? Existe algo a dizer ao shell para reescrever a linha atual ao redirecionar?

Sobre a definição de CR e LF:

A line feed means moving one line forward. The code is \n. A carriage return means moving the cursor to the beginning of the line. The code is \r.

    
por Synxis 07.04.2016 / 14:44

2 respostas

3

Quando você redireciona a saída, os bytes são gravados no destino não processado. Como você imagina, por exemplo, seqüências ANSI para manipulação de cores podem ser "processadas" quando redirecionadas? O mesmo com CR. É apenas escrito para saída.

Os aplicativos podem detectar que não estão conectados ao dispositivo real e escolher um modo diferente, "processando" códigos internamente. Talvez, as aplicações ncurses façam isso, mas acredito que é uma cortesia.

Por outro lado, quando você cat ou type desse arquivo capturado, os códigos brutos seriam processados pelo dispositivo tty.

    
por 07.04.2016 / 17:29
-1

O retorno de carro deve retornar o cursor para a margem esquerda. Esta é a funcionalidade básica. O avanço de linha deve mover o cursor uma linha para baixo. Algum software / hardware só fará a funcionalidade básica. No entanto, outros softwares / hardwares tratam um retorno de carro descoberto e / ou alimentação de linha simples como um par de retorno de carro / linha de alimentação. O que você está vendo são variações desse comportamento.

Vários O / Ss e outros softwares usam um retorno de carro nulo ou uma alimentação de linha simples como um terminador de linha. Eles normalmente irão renderizar o terminador de linha avançando para o início da próxima linha. A experiência de comportamento requer que o console insira um retorno de carro quando um feed de linha é enviado. Tente executar o programa depois de desabilitar esse comportamento com o comando stty -onlcr . Isso pode ser revertido com o comando stty onlcr ou stty sane .

A saída da instrução de impressão não é processada e fornece a saída correta no console. Se você estava usando um terminal diferente, você pode obter os mesmos resultados de quando ele é processado enquanto está sendo canalizado.

    
por 07.04.2016 / 15:30