Poderíamos organizar um sed
para remover os códigos de cores da saída que vai para o arquivo de log. Embora isso requeira obter a saída de tee
para stdout e para um pipe, isso não é exatamente simples. Pode haver maneiras melhores do que o truque de redirecionamento de subshell. Isso parece funcionar com o Bash e o GNU sed, o stdout obtém um error
vermelho, o arquivo de log não recebe códigos de cores:
#!/bin/bash
exec > >( (tee -a /dev/fd/7 | sed -Ee $'s/3''\[[0-9][0-9]?m//g ' > logfile) 7>&1 )
N=$'3[0m'
R=$'3[31m'
echo "${R}error${N}: foo"
Outra opção no shell que evita os efeitos com a reabertura de /dev/fd/N
no Linux:
#!/bin/bash
exec > >(
exec 7>logfile
while IFS= read -r x ; do
echo "$x"
x=${x//$'3'\[[0-9]m}
x=${x//$'3'\[[0-9][0-9]m}
echo "$x" >&7
done
)
N=$'3[0m'
R=$'3[31m'
echo "${R}error${N}: foo"
Embora isso, é claro, tenha problemas com bytes NUL, mas uma saída de log provavelmente não possui muitos deles. Possivelmente, um script em Perl seria melhor aqui.
Se você se importasse apenas com mensagens impressas a partir do script, poderia criar uma função para imprimir a mensagem tanto para stdout quanto para o arquivo de log e remover os códigos de cores do último. Isso não ajudaria a obter a saída dos comandos para o mesmo arquivo de log.