Zachowaj kolory, łącząc je z tee

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

Bez rury / trójnika jest kolorowy. Jak mogę to zrobić, aby pozostało kolorowe podczas używania tee(można pokolorować tylko na ekranie, nie dbam o kolory w logach).

Paweł Gościcki
źródło

Odpowiedzi:

84

Po prostu wstaw unbufferprzed każdą komendą, aby pomyślała, że ​​pisze na interaktywnym wyjściu, nawet jeśli faktycznie jest przesyłana do innego pliku wykonywalnego. Pozwoli to zachować kolor w przypadku ls.

Na przykład

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

Jeśli jeszcze go nie masz, w Ubuntu i innych dystrybucjach systemu Linux Debian możesz to unbufferzrobić.

sudo apt-get install expect-dev
Eamonn O'Brien-Strain
źródło
6
Innym rozwiązaniem, które nie wymaga niczego instalowania, jest na stackoverflow.com/questions/3515208/...
Tgr
3
To powoduje, że wynikowy plik zawiera kody kolorów (oczywiście); czy jest jakiś sposób, aby wydrukować plik w sposób, który wykorzystuje kody kolorów i prawidłowo wyświetla kolory w terminalu?
Kyle Strand,
2
Ugh, to sprawia, że ​​hasła wpisują twoje hasło w postaci jawnego tekstu!
AndiDog,
@Tgr To rozwiązanie nie działało dla mnie w OS X, próbując uzyskać surowe kolorowe wydruki xcodebuild- zamiast tego dostałem pocięte linie bez koloru. unbuffer xcodebuild | less -Rdziałało jednak bezbłędnie.
Slipp D. Thompson
2
Nie potrzebujesz expect-devpaczki. expectwystarczy.
Yajo
11

Użyj opcji ls --color=always

--color=auto nie będzie kolorować danych wyjściowych w potoku - z oczywistych powodów.

Strona główna mówi:

W przypadku --color = auto kody kolorów są wyprowadzane tylko wtedy, gdy standardowe wyjście jest podłączone do terminala (tty).

RedGrittyBrick
źródło
2
DOBRZE. To wyjaśnia to. Ale czy nadal mogę jakoś zobaczyć kolory na ekranie? (W końcu to TTY). Nie przeszkadza mi to, że NIE mam ich w pliku dziennika, ale na pewno chcę je na ekranie.
Paweł Gościcki,
Myślę, że nie wyraziłem się wystarczająco jasno. ls -lbył tylko przykładem. Mam zupełnie inne polecenie (dzienniki heroku), które usuwa kolory, gdy są przesyłane strumieniowo tee. I chcę „naprawić / zmienić” tee / pipe, a nie polecenie, które wykonuję.
Paweł Gościcki,
1
@Pawel, nie można łatwo naprawić w tee / pipe, ponieważ tee / pipe nie usuwają tych kodów kolorów. Problem polega na tym, że polecenie początkowe widzi, że nie zapisuje do terminala. Potrzebujesz pseudo-terminala, który działa jak potok, ale którego polecenia widzą jako terminal.
RedGrittyBrick
Hm ... dość uczciwie. Chyba muszę zaakceptować, że tak właśnie jest.
Paweł Gościcki
3
@ PawełGościcki ta odpowiedź naprawia tylko problem ls. Zobacz moją odpowiedź, która rozwiązuje problem dla wszystkich programów, w tym dzienników heroku.
Eamonn O'Brien-Strain
3

Rozwinę scriptrozwiązanie podane w komentarzu do zaakceptowanej odpowiedzi. Używanie scriptmoże być przydatne w przypadku, gdy nie możesz lub nie chcesz instalować oczekiwanego pakietu zawierającego unbufferkomendę.

Wydrukuj ls wyjście na standardowe wyjście i plik z kodami kolorów :

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

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

Wyświetl plik wyjściowy w kolorach:

less -r output.log
Juuso Ohtonen
źródło
2
-ejest tym samym, co --return- nie ma potrzeby obu; -efqjest --return --flush --quiet.
Noel Maersk
@NoelMaersk Thanks. W odpowiedzi umieściłem wyjaśnienia parametrów.
Juuso Ohtonen