Existe alguma maneira de sair do modo de seguimento "less" sem parar outros processos no pipe?

4

Muitas vezes eu me encontro na necessidade de ter a saída em um buffer com todos os recursos (rolagem, busca, atalhos, ...) e eu me acostumei a less .

No entanto, a maioria dos comandos que eu uso geram saída continuamente. Usar less com saída contínua não funciona da maneira que eu esperava.

Por exemplo:

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | less -R

Isso faz com que less capture a saída até atingir a altura máxima do terminal e, nesse ponto, tudo pára (esperançosamente, ainda aceitando dados), permitindo que eu use as teclas de movimentação para rolar para cima e para baixo. Este é o efeito desejado.

Estranhamente, quando eu pego o conteúdo gerado (geralmente com PgDn ), isso faz com que less bloqueie e siga novos dados, não permitindo que eu use chaves de movimentação até terminar com < kbd> ^ C e pare o comando original. Este não é o efeito desejado.

Estou usando less incorretamente? Existe algum outro programa que faça o que eu desejo? É possível "desbloquear" deste modo?

Obrigado!

    
por normalra 19.04.2015 / 11:08

2 respostas

4

Funciona bem para mim quando se olha para um arquivo que está sendo anexado, mas não quando a entrada vem de um pipe (usando o comando F - control-C funciona bem então).

Veja a discussão em Siga um canal usando menos? - este é um bug / falha conhecido em less .

    
por 19.04.2015 / 12:09
2

Is there any way to exit “less” follow mode without ^C?

Não, mas você pode organizar as coisas para que CTRL - C não afete outros processos no pipe, permitindo que eles sejam executados.

Solução A - movendo-se menos para o seu próprio grupo de processos usando o modo monitor do shell ( set -m )

while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done | (set -m; less -R)

A ideia vem do PSkocik e foi dada em sua resposta .

Solução B - manipulando SIGINT ( CTRL - C ) para que não seja entregue a outros processos no pipe

(trap '' SIGINT; exec bash -c 'while sleep 0.5
do
    echo "$(cat /dev/urandom | tr -cd 'a-zA-Z0-9' | head -c 100)"
done') | less -R

Solução dada por geirha no canal #bash do IRC.

    
por 01.08.2017 / 13:37