Préservez les couleurs lorsque vous passez au tee

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

Sans pipe / té c'est coloré. Comment puis-je faire pour qu'il reste coloré lors de l'utilisation tee(ne peut être coloré que sur l'écran, je ne me soucie pas des couleurs dans les journaux).

Paweł Gościcki
la source

Réponses:

84

Il suffit d’insérer unbufferavant toute commande pour lui faire croire qu’elle écrit sur une sortie interactive, même si elle 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é, vous pouvez l'installer unbufferavec Ubuntu et d'autres distributions Linux Debian .

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
la source
6
Une autre solution, qui ne nécessite aucune installation, est à stackoverflow.com/questions/3515208/…
Tgr
3
Cela fait que le fichier résultant contient des codes de couleur (bien sûr); existe-t-il un moyen d' imprimer le fichier de manière à utiliser les codes de couleur et à afficher correctement les couleurs dans le terminal?
Kyle Strand
2
Ugh, cela rend les entrées de mot de passe montrent votre mot de passe en texte clair!
AndiDog
@Tgr Cette solution n'a pas fonctionné pour moi sur OS X en essayant d'obtenir la sortie couleur brute de xcodebuild- au lieu de cela, j'ai eu des lignes hachées sans couleur. unbuffer xcodebuild | less -Rtravaillé parfaitement, cependant.
Slipp D. Thompson
2
Vous n'avez pas besoin du expect-devpaquet. expectest assez.
Yajo
11

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

RedGrittyBrick
la source
2
D'ACCORD. Ceci explique cela. Mais puis-je quand même voir les couleurs à l'écran? (C'est un ATS après tout). Cela ne me dérange pas de ne pas les avoir dans le fichier journal, mais je les veux sûrement sur mon écran.
Paweł Gościcki
Je pense que je me suis fait pas assez clair. ls -létait juste un exemple. J'ai une commande complètement différente (journaux Heroku) qui supprime les couleurs lors du transfert tee. Et je veux "réparer / changer" le tee / pipe, pas la commande que j'exécute.
Paweł Gościcki
1
@Pawel, vous ne pouvez pas le réparer facilement dans un tee / pipe car les tee / pipes ne suppriment pas ces codes de couleur. Le problème est que la commande initiale voit qu'il n'écrit pas sur le terminal. Vous avez besoin d'un pseudo-terminal qui agit comme un canal mais que les commandes voient comme un terminal.
RedGrittyBrick
Hm ... assez bien. Je suppose que je dois juste accepter que c'est comme ça.
Paweł Gościcki
3
@ PawełGościcki cette réponse ne résout que le problème ls. Voir ma réponse qui résout le problème pour tous les programmes, y compris les journaux Heroku.
Eamonn O'Brien-Strain
3

J'élargirai la scriptsolution donnée dans le commentaire de la réponse acceptée. Utiliser scriptpeut être utile si vous ne pouvez pas ou ne voulez pas installer le paquet attendu contenant la unbuffercommande.

Imprimer la ls sortie sur stdout et classer avec les 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).

Voir le fichier de sortie avec les couleurs:

less -r output.log
Juuso Ohtonen
la source
2
-eest la même chose que --return- pas besoin des deux; -efqest --return --flush --quiet.
Noel Maersk
@NoelMaersk Merci. J'ai incorporé les explications de paramètres dans la réponse.
Juuso Ohtonen