Preserve los colores mientras se hace la tubería

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

Sin tubo / te es de color. ¿Cómo puedo hacerlo para que permanezca coloreado mientras lo uso tee(solo se puede colorear en la pantalla, no me importan los colores en los registros).

Paweł Gościcki
fuente

Respuestas:

84

Simplemente inserte unbufferantes de cualquier comando para hacer que piense que está escribiendo en una salida interactiva, incluso si realmente está entrando en otro ejecutable. Esto preservará el color en el caso de ls.

Por ejemplo

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

Si aún no lo tiene instalado, en Ubuntu y otras distribuciones de Debian-ish Linux puede instalarlo unbufferhaciendo.

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
fuente
66
Otra solución, que no requiere instalar nada, está en stackoverflow.com/questions/3515208/…
Tgr
3
Esto hace que el archivo resultante contenga códigos de color (por supuesto); ¿Hay alguna manera de imprimir el archivo de una manera que utilice los códigos de color y muestre correctamente los colores en el terminal?
Kyle Strand
2
¡Uf, eso hace que las entradas de contraseña muestren su contraseña en texto sin cifrar!
AndiDog
@Tgr Esa solución no funcionó para mí en OS X tratando de obtener la salida de color sin procesar de xcodebuild- en cambio obtuve líneas cortadas sin color. unbuffer xcodebuild | less -RSin embargo, funcionó a la perfección.
Slipp D. Thompson
2
No necesitas el expect-devpaquete. expectes suficiente.
Yajo
11

Use la opción ls --color=always

--color=auto no dará color a la salida de una tubería, por razones obvias.

La página principal dice lo siguiente:

Con --color = auto, los códigos de color se emiten solo si la salida estándar está conectada a un terminal (tty).

RedGrittyBrick
fuente
2
OKAY. Eso lo explica. Pero, ¿puedo ver de alguna manera los colores en la pantalla? (Es un TTY después de todo). No me importa NO tenerlos en el archivo de registro, pero seguramente los quiero en mi pantalla.
Paweł Gościcki
Creo que no me hice lo suficientemente claro. ls -lfue solo un ejemplo. Tengo un comando completamente diferente (registros de heroku) que elimina los colores cuando se canaliza tee. Y quiero "arreglar / cambiar" tee / pipe, no el comando que estoy ejecutando.
Paweł Gościcki
1
@Pawel, no puede arreglarlo fácilmente en tee / pipe ya que tee / pipe no elimina estos códigos de color. El problema es que el comando inicial ve que no está escribiendo en la terminal. Necesita un pseudo-terminal que actúe como una tubería pero que los comandos vean como un terminal.
RedGrittyBrick
Hm ... bastante justo. Supongo que solo necesito aceptar que así es.
Paweł Gościcki
3
@ PawełGościcki esta respuesta solo soluciona el problema ls. Vea mi respuesta que soluciona el problema para todos los programas, incluidos los registros de heroku.
Eamonn O'Brien-Strain
3

Expandiré la scriptsolución dada en el comentario de la respuesta aceptada. El uso scriptpuede ser útil en caso de que no pueda o no quiera instalar el paquete de esperar que contiene el unbuffercomando.

Imprima la ls salida en stdout y archive con códigos de color :

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

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

Ver el archivo de salida con colores:

less -r output.log
Juuso Ohtonen
fuente
2
-ees lo mismo que --returnno hay necesidad de ambos; -efqes --return --flush --quiet.
Noel Maersk
@NoelMaersk Gracias. Incorporé las explicaciones de los parámetros en la respuesta.
Juuso Ohtonen