Como imprimir erro padrão em vermelho

12

Como posso imprimir o erro padrão em vermelho no console, em vez de usar a mesma cor da saída padrão?

É possível usar o Terminal do Gnome ?

    
por Aslan986 17.09.2012 / 19:34

2 respostas

7

Eu uso stderred e descobri que é uma boa solução. Como suas anotações readme :

  

Stderred engancha em write () e uma família de funções de fluxo (fwrite, fprintf, error ...) da libc para colorir toda a saída stderr que vai para o terminal, tornando-a distinguível da stdout. Basicamente, ele envolve o texto que vai para o arquivo com o descritor "2", com códigos de escape ANSI apropriados, tornando o texto vermelho.

     

Ele é implementado como uma biblioteca compartilhada e não requer a recompilação de binários existentes, graças ao recurso de pré-carregamento / inserção de vinculadores dinâmicos.

     

É suportado no Linux (com LD_PRELOAD), FreeBSD (também LD_PRELOAD) e OSX (com DYLD_INSERT_LIBRARIES).

É fácil compilar, mas você precisa compilá-lo a partir do código-fonte seguindo as instruções do site do Github :

sudo apt-get install build-essential git cmake 

Então

git clone git://github.com/sickill/stderred.git
cd stderred

Então

make

A parte mais importante é adicionar a linha apropriada ao seu .bashrc ; você deve vincular ao arquivo libstderred.so no diretório de compilação; você deve usar o caminho absoluto onde o diretório de construção é (/ home / mike / src / stderred / build). Adicionei o seguinte ao meu .bashrc :

export LD_PRELOAD="/home/mike/src/stderred/build/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

Obviamente, quando você não quiser mais usá-lo, remova a linha acima do seu .bashrc e reinicie o terminal.

Os resultados, testados em arquivos inexistentes (obviamente, não funcionarão quando sudo for usado, pois o .bashrc do usuário não será lido quando o ambiente diferente for definido):

(A propósito, não ativa o meu duke @ nukem como vermelho; )

    
por user76204 17.09.2012 / 20:42
4

Em geral, sim, já que o Gnome Terminal é um terminal ANSI e suporta os códigos de escape ANSI padrão.

Aqui está um exemplo. Digite isso no seu terminal:

echo -e "\e[01;31mREDRUM\e[0m"

A opção -e permite interpretar os códigos de contrabarra, para que \e se torne "Esc" (código hexadecimal 0x1B). Alternativamente, para inserir escape diretamente, pressione Ctrl-V Esc :

echo  "^[[01;31mREDRUM^[[0m"

Escape e [ formam juntos o código que é reconhecido pelo terminal. Depois dessa sequência, você precisa inserir uma lista de atributos separada por dois-pontos ( ; ), terminada por m . Veja aqui para todos os códigos. Os exemplos incluem o atributo 0 (redefinir todos os atributos, como você pode notar acima, que é a sequência que finaliza meu exemplo) e um monte de estilo (sublinhado, brilhante, negrito etc.) e alguns atributos de cor.

A resposta acima diz-lhe como usar as cores quando escreve o seu próprio programa.

No entanto, se eu entendi sua pergunta corretamente, você gostaria de ter uma separação visual para stderr e stdout de qualquer programa que esteja executando. Isso não é simples sem analisar sua saída por meio de um filtro. Aqui está um exemplo (encontrado aqui ) como fazer:

  1. Defina uma função (você pode colocá-la no seu arquivo .bashrc):

    color() { "$@" 2>&1>&3|sed 's,.*,\x1B[31m&\x1B[0m,'>&2; } 3>&1
    
  2. Inicie programas como este:

    color program
    

O stderr dos programas ficará vermelho.

    
por January 17.09.2012 / 20:37