Linux menos comportamento e stderr

11

Eu estou assistindo a saída do meu comando complicado com less, o problema é que stderrse perde. stderrlinhas normalmente são listadas entre as stdoutlinhas internas less. Gostaria que eles fossem impressos no console e, quando eu sair less, para vê-los juntos.

Sei que pode haver nenhuma solução para isso, eu li sobre teee multiteemas sem sorte até agora.

haelix
fonte
2
Você está me dizendo como redirecionar stderr para stdout, mas não era isso que eu queria. Eu não quero que stderr se misture com stdout por menos. Eu gostaria que o stderr estivesse no terminal quando sair menos.
Se stderrfor redirecionado para stdout, toda a saída para stderr será misturada com a saída normal ativada stdout. A tubulação dessa saída lessmostrará os dois.
Algum programador
Se eu ignorar "stderr para estar no terminal quando sair menos", sugiro pressionar Ctrl-L lesspara repintar a tela.
Kamae

Respostas:

10

Talvez

command 2> command.err | less; cat command.err; rm command.err

Termo aditivo

Segue um esclarecimento para as pessoas que negligenciam ler atentamente a pergunta e que não leram o comentário esclarecedor do OP acima.

haelix apontou:

linhas stderr normalmente são listadas entre linhas stdout dentro de menos

e, em um comentário para respondentes iniciais, escreveu:

Você está me dizendo como redirecionar stderr para stdout, mas não era isso que eu queria. Eu não quero que stderr se misture com stdout por menos. Gostaria que o stderr estivesse no terminal quando sair menos

O problema provavelmente é específico de plataforma, é certamente algo que experimentei em plataformas mais antigas do Unix SVR4.

Se, nessas plataformas, você fizer algo como

 find / ... | less

quaisquer mensagens de erro (por exemplo, permissões de diretório) aparecem assim em menos

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

para que as linhas de saída sejam obscurecidas por mensagens de erro.

Se você atualizar a página, as linhas de saída serão mostradas corretamente, mas você perderá as mensagens de erro. Quando você sai menos, a tela é limpa, exceto por um prompt de comando.

Se você fizer algo como

  find / ... 2>&1 | less

As mensagens de erro são misturadas com a saída padrão. Novamente, quando você sai menos, a tela está vazia.

Se você deseja primeiro examinar apenas a saída padrão em menos, e depois ver as mensagens de erro após sair menos, precisará de uma solução diferente.

Era isso que eu tentava sugerir na minha resposta original de duas linhas.

RedGrittyBrick
fonte
Isso é lixo. A resposta de Joachim deve ser a aceita.
Vanilla Rosto
2
@ VanillaFace: adicionei algum material de esclarecimento à minha resposta.
RedGrittyBrick
15

Você precisa redirecionar stderrpara stdout:

$ ./somecommad 2>&1 | less

Verifique o manual do seu shell (por exemplo man bash).

Algum cara programador
fonte
11
Comente para novos leitores desta pergunta antiga (não para Joachim em particular) É isso que todo mundo pensa à primeira vista da pergunta. Mas o problema é mais sutil - ver discussão nos comentários após a resposta de dmckee
RedGrittyBrick
1

basta dizer ao shell para redirecionar o fd 2 para o fd 1 (stderr para stdout)

 make 2>&1 | less
jackdoe
fonte
1

Uma coisa que faltava em todas as respostas até agora é a razão pela qual isso está acontecendo. O problema aqui é algum tipo de condição de corrida entre o processo de saída stderre lessexibição de saída stdoutno terminal. Se lesscomeçar a ser exibido depois que toda a saída stderrtiver sido impressa no terminal, ela lessserá preservada e você poderá ver as mensagens depois de sair less. OTOH, se lessjá começou a exibir coisas, as mensagens de erro se misturam com lessa saída de nada e nada é preservado após as lesssaídas (porque lessapenas preserva o terminal como estava antes de começar e não sabe nada sobre as mensagens de erro que vieram no meio).

Você pode ver isso facilmente, se, por exemplo,

grep foo -r /etc | less

Todas as mensagens de erro "Permissão negada" se misturam com a lesssaída e nada estará lá depois que você sair. Se você fizer

grep foo -r /etc | (sleep 10; less)

todas (ou pelo menos a maioria) das mensagens de erro foram impressas no terminal antes de lesster a chance de exibir a saída e você verá as mensagens de erro posteriormente.

Obviamente, você normalmente não deseja esperar 10 segundos antes de iniciar less, mas com o Linux também é possível fornecer valores fracionários para o tempo de espera e, com processos de execução rápidos, muitas vezes algo tão pequeno quanto sleep 0.1é suficiente para evitar a condição de corrida. (Mas, é claro, se você quer ou precisa estar do lado realmente seguro, use a solução da RedGrittyBrick).

Elmar Zander
fonte
0

Você precisa entender o conceito de "descritores de arquivo". Normalmente, um aplicativo unix começa com três descritores de arquivo especiais:

  • Entrada padrão
  • Saída padrão
  • Erro padrão

O "tubo" |no shell se conecta stdoutde um processo ao stdindo seguinte.

Os erros, por design, não são alimentados stdinno próximo processo. Eles geralmente não fazem sentido para o próximo aplicativo e não devem ser ocultados do usuário.

Se você deseja misturar os erros no stdout, pode usar 2>&1, por exemplo , o que diz essencialmente "anexar stderr ao stdout". Por exemplo

find /etc 2>&1 | less

também deve incluir a saída de erro de arquivos inacessíveis.

find /etc 2>&1 >/dev/null | less

fornecerá apenas os erros.

Possui QUIT - Anony-Mousse
fonte
0

Estou confuso com a sua pergunta, tanto quanto posso dizer que o comportamento desejado é o padrão.

Quando eu uso

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

para fazer um teste simples,

$ ./testredirection | less

faz exatamente o que você pede. É isso que eu vejo

1
3
5
7
9
(END) 

dentro lesse

$ ./testredirection | less
0
2
4
6
8
$ 

quando eu parei less

dmckee --- gatinho ex-moderador
fonte
É estranho, mas as coisas nem sempre são assim. Tente com um script ( echo info ; echo error 1>&2) e repita o teste: ambas as linhas são direcionadas para menos.
Cyrus
@cYrus: Isso funciona como esperado para mim também. Claro que experimentei em uma caixa para Mac OS. Bash 3.2.17, menos 394. Talvez algo específico do Linux. Em qualquer caso, a abordagem do RedGrittyBrick deve funcionar bem.
dmckee --- ex-moderador gatinho
Esquisito! Debian Squeeze / Bash 4.1.5 / Menos 436
cYrus
Sim, abri um shell da caixa Scientific Linux 5.3 no trabalho e obtive o comportamento esperado com o bash 3.0.15 e menos 382. Poderia haver uma regressão lá?
dmckee --- gatinho ex-moderador
Não sei, acho que é apenas uma questão de buffer.
Cyrus
0

Por acaso, encontrei esse problema em um dos meus Debian 5.0 recentemente. por exemplo, ls abc | menos, acho que a mensagem de erro entra em menos, o que é contra o meu conhecimento.

Após algumas tentativas, descobri que é apenas algo relacionado aos buffers de tela. O stderr NÃO entra menos na verdade. Você pode usar as teclas de seta Para cima ou Para baixo (ou j / k) para demonstrar.

baga
fonte