Erhalten Sie Farben, während Sie zum Abschlag leiten


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

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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.