Siga um tubo usando menos?


25

Pode seguir menos (pressionando F) uma entrada canalizada (semelhante a um arquivo)? Para um arquivo que está sendo gravado, o comando

less <file>

seguirá o arquivo ao pressionar F.

Mas se eu tiver um comando que canalize a saída diretamente para menos, assim

command | less

pressionar F não fará nada.

Parece que os pipes não podem ser seguidos como os arquivos? Ou talvez tenha a ver com o comando também escrevendo para STDERR? O efeito que estou tentando obter é sempre ver a saída mais recente do comando: assim como manter pressionado o PageDown!

Uma observação relacionada é válida para G (vá para o final): ao canalizar diretamente para menos, não funcionará.


Respostas:


21

Pressionando Fou Gmarcas lesstentar chegar EOF entrada. Se a entrada for um tubo, lesstrava até o tubo ser fechado do outro lado (e não "não faz nada").

Isso pode ser contornado salvando a saída do comando em um arquivo temporário em segundo plano e usando-o como entrada para less:

command > /tmp/x &
less +F /tmp/x; kill %; rm /tmp/x

Não há opção para fazer isso lessapenas; no entanto, admito que seria útil.


Se a entrada for um tubo, lesstrava até que o tubo seja fechado do outro lado . Essa é uma afirmação enganosa. O que acontece é que menos chamadas são readbloqueadas, aguardando novos dados ou fechamento de canal.
Piotr Dobrogost

3
Depois de pressionar F ou G na entrada do tubo, lessnão apenas é possível ler um bloqueio, como também faz um loop aguardando EOF. E um EOF em um tubo acontece apenas se o outro lado estiver fechado.
Mik12

3
Se a lesstela fosse atualizada nesse loop, não haveria problema. O bloqueio da leitura tem pouco a ver com esse problema.
Mik12

11
@Flow, este não é um problema, era a questão, mas apenas uma espera que é esperada nessa situação - uma espera por mais dados no arquivo quando o EOF for alcançado (a propósito, o que não acontecerá para um tubo fechado), ou para uma interrupção para sair do modo de acompanhamento
mik

11
O @PiotrDobrogost com leitura de bloqueio lessnão poderá atualizar a tela, se não houver dados; quando alguns dados aparecerem, o bloqueio da leitura o retornará e lessseria capaz de atualizar a tela sem um thread separado.
mik

6

Pode seguir menos (pressionando F) uma entrada canalizada (semelhante a um arquivo)?

Sim, começando com a versão 474. No entanto, ainda não foi mencionado nas notas de versão de qualquer versão, pois há um problema restante com esse recurso no momento. Abaixo está um comentário do mantenedor de menos - Mark Nudelman:

Em relação ao comando F nos tubos, isso também é corrigido em menos de 474. Em vez de procurar o EOF, o comando F procura o final da entrada em buffer e começa a ler lá. No entanto, não é realmente utilizável, porque quando você pressiona CTRL-C para interromper o comando F, ele mata o processo que produz a saída. Não sei como consertar isso.

Até que esse problema seja corrigido, menos é possível solucionar o problema usando os recursos do shell. Veja minha resposta para Existe alguma maneira de sair do modo de acompanhamento "menos" sem interromper outros processos no pipe? pergunta para detalhes.

Para referência, o problema de F não funcionar com tubos tem o número de referência 300 na lista de erros conhecidos e é intitulado O comando F não funciona na entrada canalizada.


Uma observação relacionada vale para G (vá para o final): ao canalizar diretamente para menos, não funcionará.

Funciona a partir da versão 466. Citando as notas de versão desta versão:

Novo comando ESC-G vai para o final dos dados atualmente armazenados em buffer em um pipe


O comando ESC-G foi introduzido na versão 466, lançada em 23 de agosto de 2014.
mik

@mik Parece um erro nas notas de versão da versão 471 então. Obrigado, consertado.
Piotr Dobrogost

Não é um erro, eles apenas listam as alterações incrementalmente desde uma versão estável, versão 458, neste caso. No entanto, não há versão estável com o comando ESC-G.
Mik

O comando ESC-G agora está em uma versão estável (481): "16 de outubro de 2015, menos 481 foi liberada para uso geral".
Mik

Atualização: Em relação ao comando F nos tubos, isso também é corrigido em menos-474. Em vez de procurar o EOF, o comando F procura o final da entrada em buffer e começa a ler lá. No entanto, não é realmente utilizável, porque quando você pressiona ctrl-C para interromper o comando F, ele mata o processo que produz a saída. Não sei como consertar isso. - Mark Nudelman, mantenedor de menos
Piotr Dobrogost

2

Na página de manual menos

[Keyboard] COMMANDS [...]

   F      Scroll  forward, and keep trying to read when the end of file is reached.  Normally this command would be used when already
          at the end of the file.  It is a way to monitor the tail of a file which is growing while it is being viewed.  (The  behav‐
          ior is similar to the "tail -f" command.)

então isso deve funcionar e realmente funciona para mim.


11
Esse comando se comporta de maneira diferente quando usado com pipe, conforme descrito por @mik, e claramente não é o que o OP está procurando.
Piotr Dobrogost
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.