web-dev-qa-db-fra.com

Préservez les couleurs lorsque vous passez au tee

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

Sans pipe/té c'est coloré. Comment puis-je faire en sorte qu'il reste coloré lors de l'utilisation de tee (peut être coloré uniquement à l'écran, les couleurs dans les journaux ne me dérangent pas).

56
Paweł Gościcki

Insérez simplement unbuffer avant toute commande pour lui faire croire qu'il écrit sur une sortie interactive, même si celle-ci est en train de se raccorder à un autre exécutable. Cela préservera la couleur dans le cas de ls.

Par exemple

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

Si vous ne l'avez pas déjà installé, sur Ubuntu et d'autres distributions Linux Debian-ish, vous pouvez installer unbuffer en le faisant.

Sudo apt-get install expect-dev
78

Utilisez l'option ls --color=always

--color=auto ne colorera pas la sortie vers un pipeline - pour des raisons évidentes.

La page principale dit ce qui suit:

Avec --color = auto, les codes de couleur ne sont émis que si la sortie standard est connectée à un terminal (tty).

10
RedGrittyBrick

J'élargirai la solution script donnée dans le commentaire de la réponse acceptée. Utiliser script peut être utile si vous ne pouvez ou ne voulez pas installer le package expect contenant la commande unbuffer.

Imprimer ls sortie sur stdout et fichier avec codes de couleur :

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

où (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).

Afficher le fichier de sortie avec les couleurs:

less -r output.log
1
Juuso Ohtonen