Menos interrupção em menos

13

Costumo canalizar a saída do programa para menos, por exemplo

produce_output | less

Isso funciona muito bem, até produce_outputproduzir grandes quantidades de saída. Se eu procurar algum texto que esteja dentro do arquivo, menos relatórios

Calculating line numbers... (interrupt to abort)

Se eu interromper com Control + C, ele também mata produce_output, o que impede de produzir mais saída. Existe alguma maneira de enviar a interrupção para menos, para que produce_outputcontinue funcionando?

Eu sei que poderia usar kill -INT less_process, mas acho que deve haver uma solução melhor.

Ed McMan
fonte

Respostas:

15

Normalmente, todos os processos em um pipeline são executados no mesmo grupo de processos , fazendo com que todos recebam o sinal. Você pode usar setsid foo | lesspara executar fooem um pgrp diferente.

user1686
fonte
À luz do problema levantado pelo OP, parece que a decisão de usar CTRL + C como uma maneira de interromper menos é muito lamentável. Você sabe por que esse sinal específico foi escolhido? Algum outro sinal seria menos problemático?
Piotr Dobrogost
@PiotrDobrogost: Que outro sinal você sugeriria? Não há muitos que tenham atalhos de teclado dedicados, apenas SIGINT (Ctrl-C) e SIGQUIT (Ctrl- \), e o último deve sair do programa imediatamente, não apenas interromper. O restante está disponível apenas via kill.
precisa saber é o seguinte
Parece que o problema é causado pelo uso do sinal para interromper menos. Em vez disso, se fosse alguma tecla / atalho normal , não teríamos o problema em primeiro lugar. No entanto, acho que a necessidade de um sinal vem do fato de que o processo não pode ser usado selectpara aguardar a entrada de um arquivo / canal e terminal ao mesmo tempo.
Piotr Dobrogost
@PiotrDobrogost: É assim que funciona o modo F(seguir). Tubos e ttys são pesquisáveis ​​da mesma maneira.
precisa saber é o seguinte
Por que você acha que é assim que o modo seguir funciona? Eu acho que o fluxo de eventos é que o shell obtém CTRL + C e envia o sinal SIGINT para menos, o que recebe esse sinal de forma assíncrona sem ouvir o teclado / terminal.
Piotr Dobrogost
9

Você pode desativar os números de linha com o

   -n or --line-numbers

opção.

produce_output | less -n
Matteo
fonte
-1: pode resolver o problema instigante do OP, mas não responde à pergunta real do OP (por exemplo, interromper um processo).
goldPseudo
2
Desculpe, mas começar menos com um recurso que não é desejado e tentar enviar um sinal para desativar um recurso que você pode desativar com um comutador é uma solução alternativa e não uma solução. É claro que a solução @grawity é boa (e eu votei nela), mas vamos lá: iniciar o primeiro processo em outro grupo para poder enviar um sinal para interromper uma tarefa (contagem de linhas) desnecessária também é um pouco demais muito trabalho.
Matteo
1
Esta é uma solução justa para o problema que coloquei na minha pergunta. No entanto, as interrupções param mais do que apenas a contagem de linhas em menos - por exemplo, elas interrompem também uma longa pesquisa. Portanto, a solução do @ grawity é preferida, pois cobriria qualquer uso de interrupções em menos. Meu mal por não abordar isso mais claramente na questão!
Ed McMan #
@ EdMcMan Claro, eu também votei na solução da gravidade e fico feliz em aprender algo novo que sempre pode ser útil.
Matteo
0

Ao trabalhar com grandes quantidades de saída, achei muito útil enviar a saída para um arquivo e usar tail -fou less +Fassistir, por exemplo:

produce_output > out 2>&1 & less +F out

A 2>&1sintaxe garante que stdout e stderr vão para out--- remova-o se você quiser que o stdout vá para o arquivo. Dessa forma, você pode inspecionar a saída de várias maneiras (mesmo de uma máquina diferente) sem precisar mexer no programa que produz a saída.

Observe que 2>&1pode ser específico do bash (não tenho certeza). Verifique se você possui espaço em disco suficiente para o arquivo de saída :-)

jrennie
fonte
Cauda só vai mostrar-lhe o arquivo, Ed especificado que ele está usando menos interativa (por exemplo, ele tem que procurar no arquivo)
Matteo
2>&1é POSIX, nu >&é um basismo.
User1686
FWIW, 2> & 1 também funciona em Windows XP, 7, 2008, etc.
jftuga
@ Matteo: sim, eu deveria ter usado less +Fno meu exemplo; Acabei de atualizar minha resposta.
jrennie
1
@ Matteo: A contagem de linhas não é o mesmo problema less +F(pois less +Fprocessa os dados à medida que são gerados). O exemplo que eu dei não tem o mesmo problema que o post originalmente: ctrl + c não será interrompido process_output. Se alguém não se importa com a funcionalidade 'follow', pode executar produce_output > out 2>&1, então less out. Um problema produce_output | lessé que, se algo quebrar o tubo (por exemplo, pressionar acidentalmente 'q' less), ele produce_outputmorrerá (sem manipulação especial do SIGPIPE).
jrennie
0

Você também pode fazer isso:

less +F -f <(produce_output)
Eric Woodruff
fonte