Ao automatizar uma tarefa, é sensato testá-la primeiro manualmente. Seria útil, no entanto, se algum dado que fosse armazenado no stderr fosse imediatamente reconhecido como tal, e distinguível dos dados que armazenassem o stdout, e ter toda a saída juntos, para que fique óbvio qual é a sequência de eventos.
Um último toque que seria bom é se, na saída do programa, ele imprimisse seu código de retorno.
Todas essas coisas ajudariam na automação. Sim, eu posso ecoar o código de retorno quando um programa termina, e sim, eu posso redirecionar stdout e stderr; o que eu realmente gostaria de algum shell, script ou redirecionador fácil de usar que mostre stdout em preto, mostre stderr intercalado com ele em vermelho e imprima o código de saída no final.
Existe uma fera assim? [Se importa, estou usando o Bash 3.2 no Mac OS X].
Atualização : Desculpe, já faz meses desde que eu olhei para isso. Eu vim com um script de teste simples:
#!/usr/bin/env python
import sys
print "this is stdout"
print >> sys.stderr, "this is stderr"
print "this is stdout again"
Nos meus testes (e provavelmente devido à maneira como as coisas são armazenadas em buffer), o rse e o hilite exibem tudo, desde stdout e, em seguida, tudo sobre stderr. O método fifo acerta a ordem, mas parece colorir tudo que segue a linha stderr. ind reclamou das minhas linhas stdin e stderr e depois colocou a saída do stderr por último.
A maioria dessas soluções é viável, pois não é atípico que apenas a última saída vá para o stderr, mas ainda assim, seria bom ter algo que funcionasse um pouco melhor.
Respostas:
Você também pode conferir stderred: https://github.com/sickill/stderred
fonte
Eu apenas inventei um método maluco envolvendo FIFOs.
Se você quiser que a saída stderr seja separada, você pode abrir dois shells separados e executar "
grep --color . foo
" em um sem o&
, e executar o comando no outro (ainda com o2>foo
). Você obterá o stderr nogrep
primeiro e o stdout no principal.Isso funciona porque a saída stderr é roteada através do FIFO para
grep --color
, cuja cor padrão é vermelha (pelo menos é para mim). Quando terminar, apenasrm
o FIFO (rm foo
).Advertência : Eu realmente não tenho certeza de como isso irá lidar com a ordem de saída, você terá que testá-la.
fonte
Sim, isso é possível. Veja a seção "Tornar o STDERR vermelho" neste site para um exemplo de trabalho.
O código básico é este
Uma breve explicação é dada na própria função. O que é preciso é mover STDOUT e STDERR, para que o sed coloque STDERR em 1, colore e cole novamente. Pense no fluxo de arquivos 3 como uma variável temporária aqui.
A ligação é bem simples
No entanto, certas invocações não funcionarão conforme o esperado; todas as advertências são fornecidas na página vinculada.
Aliás, acho que também é possível vir com uma solução da forma
onde rse colorirá a saída.
Eu também encontrei esse projeto hilite que parece fazer isso. Ainda não experimentei, mas pode ser o que você está procurando.
Outros projetos relacionados:
fonte
Outro programa é ind:
http: // www.habets.pp.se/synscan/programs.php?prog=ind (você precisa montar o hiperlink por conta própria, não tenho pontos suficientes para mais de um por resposta). Há uma captura de tela e até um screencast lá.
Ele executa o subprocesso em um arquivo, o que os outros provavelmente não. Isso pode importar para onde a ordem é importante (geralmente), uma vez que o stderr é liberado imediatamente nos terminais e o stdout é totalmente armazenado em buffer quando não é um tty.
Para uma explicação completa, consulte o seguinte: http://blog.habets.pp.se/2008/06/Buffering-in-pipes
Além disso, ind trabalha com programas interativos e caracteres de controle. O Bash funciona como normal quando iniciado com "ind bash -i".
Isso pode funcionar para fornecer cores e preservar Ctrl-P et.al.
fonte
Aqui estão muitas respostas para destacar a saída stderr ainda. Só posso adicionar uma bem fácil - em uma linha, que você anexa ao comando:
Mas você deve adicionar este comando após cada vez.
Pessoalmente, gosto da possibilidade mencionada por @nagul, a função rse adicionada ao bashrc.
Mas quero adicionar a solução para imprimir o código de saída. Você pode adicionar esse valor ao início da linha do prompt do bash:
Onde EC é o código de saída do comando.
Tenho definido da maneira que, quando o código de saída for 0, ele não será impresso, mas qualquer outro valor será impresso antes do próximo prompt na cor vermelha.
Todo o truque é feito em ~ / .bashrc:
A linha de prompt é definida por padrão pela variável PS1. Copie o que você tem aqui na variável PROMPT e, em seguida, crie a variável PS1 com ou sem código de saída.
O Bash mostrará as informações na variável PS1 no prompt.
fonte
existe
annotate-output
utilidade (devscripts
pacote Debian), se você quiser fazê-lo sem coresfonte