Preservar cores enquanto conduz para tee

62
ls -l --color=auto | tee output.log

Sem pipe / tee é colorido. Como posso fazê-lo para que fique colorido durante o uso tee(pode ser colorido apenas na tela, não me importo com cores nos logs).

Paweł Gościcki
fonte
Já perguntou no Unix e Linux .
Dan Dascalescu 15/09/16

Respostas:

84

Simplesmente insira unbufferantes de qualquer comando para fazê-lo pensar que está gravando em uma saída interativa, mesmo que esteja realmente canalizando para outro executável. Isso preservará a cor no caso de ls.

Por exemplo

unbuffer ls -l --color=auto | tee output.log

Se você ainda não o instalou, no Ubuntu e em outras distribuições Linux Debian você pode instalar unbufferfazendo isso.

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
fonte
6
Outra solução, que não requer a instalação de nada, está em stackoverflow.com/questions/3515208/…
Tgr 31/01
3
Isso faz com que o arquivo resultante contenha códigos de cores (é claro); existe alguma maneira de imprimir o arquivo de uma maneira que faça uso dos códigos de cores e exiba adequadamente as cores no terminal?
Kyle Strand
2
Ugh, isso faz com que as entradas de senha mostrem sua senha em texto não criptografado!
AndiDog 20/08/2015
@Tgr Essa solução não funcionou para mim no OS X tentando obter a saída de cores brutas xcodebuild- em vez disso, recebi linhas cortadas sem cor. unbuffer xcodebuild | less -Rfuncionou perfeitamente, no entanto.
Slipp D. Thompson
2
Você não precisa do expect-devpacote. expectbasta.
Yajo 4/09/18
11

Use a opção ls --color=always

--color=auto não colorirá a saída em um pipeline - por razões óbvias.

A página principal diz o seguinte:

Com --color = auto, os códigos de cores são emitidos apenas se a saída padrão estiver conectada a um terminal (tty).

RedGrittyBrick
fonte
2
ESTÁ BEM. Isso explica tudo. Mas ainda posso ver as cores na tela? (É um TTY, afinal). Não me importo de NÃO tê-los no arquivo de log, mas certamente os quero na minha tela.
Paweł Gościcki 2/11
Eu acho que não me deixei claro o suficiente. ls -lfoi apenas um exemplo. Eu tenho um comando completamente diferente (registros heroku) que retira cores quando canalizadas tee. E eu quero "consertar / alterar" tee / pipe, não o comando que estou executando.
Paweł Gościcki 2/11
1
@Pawel, você não pode consertá-lo facilmente no tee / pipe, pois o tee / pipe não está removendo esses códigos de cores. O problema é que o comando inicial vê que não está gravando no terminal. Você precisa de um pseudo-terminal que atue como um tubo, mas que comandos vêem como um terminal.
RedGrittyBrick #
Hum ... justo o suficiente. Acho que só preciso aceitar que é assim.
Paweł Gościcki 3/11
3
@ PawełGościcki esta resposta apenas resolve o problema ls. Veja minha resposta que corrige o problema para todos os programas, incluindo os logs heroku.
Eamonn O'Brien-Strain
3

Expandirei a scriptsolução dada no comentário da resposta aceita. O uso scriptpode ser útil caso você não possa ou não queira instalar o pacote expectável que contém o unbuffercomando.

Imprima a ls saída em stdout e arquive com códigos de cores :

script -efq output.log -c "ls -l --color=auto"

onde ( man script):

  -e, --return
         Return the exit code of the child process.  Uses the same
         format as bash termination on signal termination exit code is 128+n.
  -f, --flush
         Flush output after each write.  This is nice for telecooperation:
        one person does `mkfifo foo; script -f foo', and another can 
        supervise real-time what is being done using `cat foo'.
  -q, --quiet
         Be quiet (do not write start and done messages to either 
         standard output or the typescript file).

Veja o arquivo de saída com cores:

less -r output.log
Juuso Ohtonen
fonte
2
-eé o mesmo que --return- não há necessidade de ambos; -efqé --return --flush --quiet.
Noel Maersk
@NoelMaersk Thanks. Incorporei as explicações dos parâmetros na resposta.
Juuso Ohtonen