Write to stderr

5

Estou usando stderred para colorir toda a saída transmitida para stderr red. Está funcionando bem. Mas quando eu escrevo meu próprio script bash e lanço um erro com echo 'error' 1>&2 , ele não colore a saída em vermelho. Eu acho que isso é, porque o comando simplesmente redireciona a saída para onde o descritor de arquivo stderr aponta, mas não marca corretamente a mensagem como pertencente a stderr. É assim mesmo? Como posso escrever corretamente para stderr em bash?

    
por pfnuesel 25.10.2014 / 19:28

4 respostas

6

Parece que o programa está reescrevendo as várias funções write () para detectar se você está imprimindo no descritor de arquivo 2 e, em seguida, adicionando os códigos de escape relevantes para tornar a saída vermelha no terminal.

Infelizmente, no shell, quando você faz algo como

echo "foo" 1>&2 

A função ainda estará chamando write (ou alguma outra chamada de sistema semelhante) no descritor de arquivo 1. A saída aparece no fd 2, pois o descritor de arquivo 1 foi copiado para o descritor de arquivo 2 pelo seu shell.

Infelizmente, não sei como escrever / diretamente / para o fd 2 no shell, mas você pode usar o awk. Uma função como essa grava os argumentos diretamente no descritor de arquivo 2.

error() {
  awk " BEGIN { print \"$@\" > \"/dev/fd/2\" }"
}

Eu acredito que este é um recurso do GNU awk que não faz parte do POSIX, mas também funciona no awk fornecido no OS X.

    
por 25.10.2014 / 20:14
4

Esse software conecta as chamadas do sistema write() que aprendem a escrever no descritor de arquivo 2, que é conhecido como stderr .

É uma biblioteca compartilhada (portanto a recompilação do kernel não é necessária). Conforme descrito no manual de instalação, ele usa o ambiente variável LD_PRELOAD . O vinculador dinâmico pode ser influenciado para modificar seu comportamento durante a execução do programa. Essas variáveis ajustam o processo de vinculação de tempo de execução pesquisando bibliotecas compartilhadas em locais alternativos.

O executável /bin/bash não honra essas variáveis, então bash usa a paleta original das chamadas do sistema, não as modificadas. O redirecionamento que você mencionou na sua pergunta aconteceu em bash . Não no executável de echo . Se echo pudesse passar para o descritor de erros sozinho (não via bash), a saída seria vermelha.

O Python pode gravar em stderr . Veja a prova (que deve aparecer em vermelho):

python -c 'import os; os.write(2, "error")'
    
por 25.10.2014 / 20:32
0

Crie uma função auxiliar:

echoerr() { printf "3[0;31m%s\n3[0m" "$*" >&2; }

E use-o em qualquer lugar:

echoerr "something went wrong here"

Isso combina a gravação em stderr ( >&2 ) e a alteração de cores (solução obtida daqui link ).

    
por 17.05.2018 / 09:54
-1

De acordo com as instruções do link , você deve adicionar ao seu script

export LD_PRELOAD="/path/to/stderred/\$LIB/libstderred.so${LD_PRELOAD:+:$LD_PRELOAD}"

onde o $LIB pode ser substituído manualmente em sua arquitetura

    
por 25.10.2014 / 20:07

Tags