menos congela na última linha quando pagina a saída de um comando em execução

3

Eu tenho um aplicativo CLI que produz muitos resultados de depuração e tenho uma grande necessidade de pesquisar na saída. Estou usando less para isso, mas ele congela quando eu alcanço a última linha com j ou G . E ele volta a viver somente depois de Ctrl + c , mas dessa forma eu mato o meu aplicativo.

O problema pode ser facilmente reproduzido quando paginar a saída de find , apenas use G logo após executá-lo.

find / | less

É um erro em less ?

    
por svlasov 10.12.2013 / 15:04

2 respostas

0

Menos lê sua entrada preguiçosamente. Quando você inicia, carrega apenas o início da entrada (o suficiente para preencher uma tela). Conforme você rola para baixo, Menos carrega mais e mais. Se você disser Menos para ir para o final da entrada, ele carregará tudo. Se a entrada for um arquivo regular, Menos simplesmente busca o final, mas quando a entrada é um canal, não há como chegar ao final dos dados além de ler tudo.

Quando um programa canaliza entrada para Less, um comando como G para mover para o final do arquivo só retorna quando o programa sai, o que pode levar uma eternidade se o programa nunca sair. Um comando que exija exibir mais uma linha pode precisar esperar que o programa produza essa linha.

Se você pressionar ^C enquanto Menos estiver lendo entrada, Menos mata o programa, o que tem o efeito colateral de fazê-lo parar de produzir entrada. Você pode navegar por todas as entradas que o programa produziu.

Você pode isolar Less do programa até certo ponto, fazendo o programa gravar em um pipe nomeado. Note que quando o programa tentar gravar no pipe, ele será bloqueado até que Less o leia (assim como com um pipeline), e se você sair de Less, o programa receberá um sinal SIGPIPE.

mkfifo f
myprogram >f &
less f

Quando a entrada é um canal nomeado, ^C enquanto Menos está lendo apenas faz Menos pausa em sua leitura, isso não afeta o programa.

Você pode colocar Less em "follow mode" (como tail -f ), com o comando F , para pular para o final e fazer a rolagem de entrada subseqüente. É o que acontece quando você tenta rolar até o final da entrada disponível até o momento; O comando F faz com que Menos esqueça que ele já fechou o arquivo de entrada. O comando less +F executa o comando F quando Less inicia, ou seja, inicia Less no modo follow.

Se você quiser navegar pela saída de depuração no seu destino e não afetar o programa, grave a saída de depuração em um arquivo e chame Less nesse arquivo. Movendo para o final do arquivo você obtém a saída até o momento, mas você pode retomar a leitura com o comando F , interromper com ^C e ler mais com F quantas vezes quiser.

    
por 11.12.2013 / 01:10
0

Este efeito é mencionado em man page de less

G or > or ESC->
          Go to line N in the file, default the end of the  file.   (Warn‐
          ing:  this may be slow if N is large, or if N is not specified
          and standard input, rather than a file, is being read.)
    
por 10.12.2013 / 15:50

Tags