Erhalten Sie Farben, während Sie zum Abschlag leiten

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

Ohne Pfeife / Tee ist es farbig. Wie kann ich es so gestalten, dass es während der Verwendung farbig bleibt tee(kann nur auf dem Bildschirm eingefärbt werden, Farben in Protokollen interessieren mich nicht).

Paweł Gościcki
quelle

Antworten:

84

Fügen Sie einfach unbuffereinen Befehl vor einen Befehl ein, um den Eindruck zu erwecken, dass er in eine interaktive Ausgabe geschrieben wird, auch wenn er tatsächlich in eine andere ausführbare Datei geleitet wird. Dadurch bleibt die Farbe im Fall von erhalten ls.

Zum Beispiel

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

Wenn Sie es noch nicht installiert haben, können Sie es auf Ubuntu und anderen Debian-basierten Linux-Distributionen installieren unbuffer.

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
quelle
6
Eine andere Lösung, für die keine Installation erforderlich ist, finden Sie unter stackoverflow.com/questions/3515208/…
Tgr 31.01.15
3
Dies führt dazu, dass die resultierende Datei (natürlich) Farbcodes enthält. Gibt es eine Möglichkeit, die Datei so zu drucken , dass die Farbcodes verwendet werden und die Farben im Terminal ordnungsgemäß angezeigt werden?
Kyle Strand
2
Puh, dass Passworteingaben Ihr Passwort im Klartext anzeigen!
AndiDog
@Tgr Diese Lösung hat unter OS X nicht funktioniert, da ich versucht habe, die rohe xcodebuildFarbausgabe von zu erhalten. Stattdessen habe ich zerhackte Linien ohne Farbe erhalten. unbuffer xcodebuild | less -Rfunktionierte jedoch einwandfrei.
Slipp D. Thompson
2
Sie brauchen das expect-devPaket nicht. expectreicht.
Yajo
11

Verwenden Sie die Option ls --color=always

--color=auto färbt die Ausgabe nicht in eine Pipeline - aus offensichtlichen Gründen.

Die Hauptseite sagt folgendes:

Bei --color = auto werden Farbcodes nur ausgegeben, wenn die Standardausgabe an eine Klemme (tty) angeschlossen ist.

RedGrittyBrick
quelle
2
OKAY. Das erklärt es. Aber kann ich trotzdem irgendwie die Farben auf dem Bildschirm sehen? (Es ist immerhin ein TTY). Es macht mir nichts aus, sie NICHT in der Logdatei zu haben, aber ich möchte sie auf meinem Bildschirm haben.
Paweł Gościcki
Ich glaube, ich habe mich nicht klar genug ausgedrückt. ls -lwar nur ein Beispiel. Ich habe einen völlig anderen Befehl (Heroku-Protokolle), mit dem Farben beim Weiterleiten entfernt werden tee. Und ich möchte Tee / Pipe "reparieren / ändern", nicht den Befehl, den ich ausführe.
Paweł Gościcki
1
@Pawel, du kannst es nicht einfach in tee / pipe reparieren, da tee / pipe diese Farbcodes nicht entfernen. Das Problem ist, dass der ursprüngliche Befehl sieht, dass er nicht in das Terminal schreibt. Sie benötigen ein Pseudoterminal , das sich wie eine Pipe verhält, das jedoch als Terminal angezeigt wird.
RedGrittyBrick
Hm ... fair genug. Ich muss wohl einfach akzeptieren, dass es so ist.
Paweł Gościcki
3
@ PawełGościcki diese Antwort behebt nur das Problem für ls. Siehe meine Antwort, die das Problem für alle Programme, einschließlich Heroku-Protokolle, behebt.
Eamonn O'Brien-Strain
3

Ich werde die scriptim Kommentar der akzeptierten Antwort angegebene Lösung erweitern . Die Verwendung von scriptkann hilfreich sein, wenn Sie das Expect- Paket, das den unbufferBefehl enthält, nicht installieren können oder möchten .

Druckausgabe ls auf Standardausgabe und Datei mit Farbcodes :

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

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

Zeigen Sie die Ausgabedatei mit Farben an:

less -r output.log
Juuso Ohtonen
quelle
2
-eist das gleiche wie --return- keine Notwendigkeit für beide; -efqist --return --flush --quiet.
Noel Maersk
@NoelMaersk Danke. Ich habe die Parametererklärungen in die Antwort aufgenommen.
Juuso Ohtonen