Linux menos comportamento e stderr

8

Estou assistindo a saída do meu comando complicado com less , o problema é que stderr se perde. stderr linhas normalmente são listadas entre stdout linhas dentro de less . Eu gostaria que eles fossem impressos no console, e quando eu sair do less , para vê-los juntos.

Eu percebo que pode não haver solução para isso, eu li sobre tee e multitee mas sem sorte até agora.

    
por haelix 10.12.2011 / 14:18

7 respostas

7

Talvez

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

Adendo

Aqui segue um esclarecimento para pessoas que negligenciam cuidadosamente a leitura da pergunta e que não leram o comentário de esclarecimento do OP acima.

haelix apontou:

stderr lines normally get listed inbetween stdout lines inside less

e, em um comentário para os primeiros respondentes, escreveu:

You're telling me how to redirect stderr to stdout but that's not what I wanted. I don't want stderr to mix with stdout inside less. I would like stderr to be in the terminal when I exit less

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

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 exibidas 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 fica vazia.

Se você deseja primeiro examinar apenas a saída padrão em menos, veja as mensagens de erro depois de sair menos, você precisa de uma solução diferente.

Isso é o que eu estava tentando sugerir na minha resposta original de duas linhas.

    
por 10.12.2011 / 16:29
14

Você precisa redirecionar stderr para stdout :

$ ./somecommad 2>&1 | less

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

    
por 10.12.2011 / 14:27
1

apenas diga ao shell para redirecionar o fd 2 para o fd 1 (stderr para stdout)

 make 2>&1 | less
    
por 10.12.2011 / 14:27
1

Uma coisa que faltava em todas as respostas até agora é a razão, por que isso está acontecendo. O problema aqui é algum tipo de condição de corrida entre o material de saída do processo para stderr e less exibindo a saída de stdout no terminal. Se less começar a exibir após , toda a saída para stderr foi impressa no terminal, então less preservará isso e você poderá ver as mensagens após sair de less . OTOH se less já começou a exibir o material, então mensagens de erro se misturam com a saída de less e nada é preservado após less sair (porque less apenas preserva o terminal como era antes de iniciar e não sabe alguma coisa sobre as mensagens de erro que entraram no meio).

Você pode ver isso facilmente, se você fizer isso, por exemplo.

grep foo -r /etc | less

Todas as mensagens de erro "Permissão negada" se misturam com a saída less 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 que less tenha a chance de exibir a saída e você verá as mensagens de erro posteriormente.

Claro, você geralmente não quer esperar 10 segundos antes de iniciar less , mas com o Linux você também pode fornecer valores fracionários para o tempo de espera, e com processos de execução rápida muitas vezes algo como sleep 0.1 é o suficiente para evitar a condição de corrida. (Mas, claro, se você quer ou tem que estar do lado realmente seguro, use a solução da RedGrittyBrick).

    
por 28.03.2018 / 18:01
0

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

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

O "pipe" | no shell conecta stdout de um processo com stdin do próximo.

Os erros são, por design, não fornecidos a stdin do próximo processo. Eles muitas vezes não fazem sentido para o próximo aplicativo e não devem ser ocultados do usuário.

Se você quiser misturar os erros em stdout, poderá usar, por exemplo, 2>&1 , que diz essencialmente "append stderr to stdout". Por exemplo

find /etc 2>&1 | less

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

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

fornecerá apenas os erros.

    
por 10.12.2011 / 16:43
0

Estou confuso sobre sua pergunta, já que posso dizer que seu comportamento desejado é o padrão.

Quando 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ê pergunta. Isso é que eu vejo

1
3
5
7
9
(END) 

em less e

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

quando eu saio de less

    
por 10.12.2011 / 17:02
0

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

Depois de algumas tentativas, descobri que é algo relacionado a buffers de tela. stderr não entra menos em realidade. Você pode usar as teclas de seta para cima ou para baixo (ou j / k) para demonstrar.

    
por 13.12.2011 / 12:00

Tags