Preservar cores enquanto conduz para tee


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

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).


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

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
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.