Como imprimir erro padrão em vermelho


14

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 Gnome Terminal ?


Este link pode ajudá-lo
devav2

Você pode ativar esse comportamento para um comando usando o hiliteutilitário . Você precisa anexar manualmente hiliteao seu comando shell para usá-lo, mas ainda é útil se você souber ou suspeitar que um comando gera erros e deseja localizá-los.
Rory O'Kane

Respostas:


8

Eu uso o stderred e achei uma boa solução. Como seu leia-me observa:

Ganchos Stderred 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-o distinguível do stdout. Basicamente, ele envolve o texto que vai para o arquivo com o descritor "2" com os códigos de escape ANSI adequados, tornando o texto em vermelho.

Ele é implementado como uma biblioteca compartilhada e não requer 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 no 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 libstderred.soarquivo no diretório de construção; você deve usar o caminho absoluto em que o diretório de construção está (/ home / mike / src / stderred / build). Eu adiciono 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 .bashrce reinicie o terminal.

Os resultados, testados em arquivos inexistentes (obviamente não funcionarão quando sudoforem utilizados, pois o usuário .bashrcnão será lido quando o ambiente diferente estiver definido):

(Aliás, o prompt do duke @ nukem não fica vermelho, pois era vermelho )

insira a descrição da imagem aqui


Não acredito que passei tantos anos sem saber que isso existe! É incrivelmente útil e deveria ter sido parte do sistema operacional por, oh, cem anos ou mais até agora. :)
Roger Dahl

6

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 -eopção permite interpretar códigos de barra invertida, \etornando-se "Esc" (código hexadecimal 0x1B). Como alternativa, para inserir escape diretamente, pressione ctrl-V Esc:

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

Escape e [ambos formam juntos o código que é reconhecido pelo terminal. Após essa sequência, é necessário inserir uma ;lista de atributos separados por dois pontos ( ), finalizados por m. Veja aqui todos os códigos. Os exemplos incluem atributo 0(redefina todos os atributos, como você pode observar acima, que é a sequência que encerra o meu exemplo) e vários estilos (sublinhado, brilhante, negrito etc.), além de alguns atributos de cores.

A resposta acima mostra como usar cores quando você escreve 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 todos os programas em execução. Isso não é simples sem analisar sua saída através de um filtro. Aqui está um exemplo (encontrado aqui ) de 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.


existe alguma maneira de torná-lo colorido qualquer mensagem de erro de qualquer programa?
6309 Luke
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.