Como posso escrever em stderr para que as cores stderred sejam vermelhas?

0

Como pano de fundo, eu previamente perguntei esta questão .

Estou usando stderred para transformar o texto stderr em vermelho quando exibido em um terminal. Isso funciona muito bem na maioria das ocasiões, mais especificamente para o que parecem ser executáveis binários em oposição aos scripts do bash.

Percebi que stderred parece não funcionar quando stderr é referenciado diretamente de um command chamado de um terminal.

Por exemplo, usando stderred ainda não tenho vermelho se eu usar o redirecionamento da seguinte forma:

echo "pomme" 1>&2

Como o redirecionamento é diferente dos outros casos em relação ao stderred hook?

Como posso ter vermelho para a saída stderr se eu redirecionar 1>&2 em um contexto /bin/bash , como faço nos meus scripts bash (Ubuntu 15.10)?

    
por Tfb9 31.12.2015 / 20:52

1 resposta

3

Se você olhar para o README de stderred , você notará que ele modifica a % funçãowrite() (e funções de fluxo associadas):

stderred hooks on write() and a family of stream functions (fwrite, fprintf, error...) from libc in order to colorize all stderr output that goes to terminal thus making it distinguishable from stdout. Basically it wraps text that goes to file with descriptor "2" with proper ANSI escape codes making text red.

Ênfase minha.

Quando você redireciona stdout para stderr, eles apontam para a mesma coisa, true. No entanto, as chamadas de função que gravaram para o stdout ainda se referem a ele como stdout, independentemente do redirecionamento feito. Eles ainda acessam o descritor de arquivo 1, não 2.

Se você deseja gravar em stderr e tê-lo colorido, o redirecionamento normal do shell não será suficiente. Você precisará usar algo que grava diretamente no stderr. A função awk em o similar Unix & A postagem do Linux pode ser adaptada para funcionar com vários argumentos:

error () (
  IFS=' '
  awk -v msg="$*" 'BEGIN { print msg > "/dev/stderr" }'
)

Eu usei /dev/stderr , pois é mais fácil de ler e mencionado em os documentos do GNU awk . Observe também que usei ( ) em vez de { } para o agrupamento de comandos. Isso faz com que os comandos sejam executados em um subshell, para que eu possa modificar com segurança o IFS sem que o shell ou script de chamada seja afetado.

Referências:

por muru 31.12.2015 / 21:23