Gdzie idą moje kody ucieczki ANSI, kiedy przesyłam potok do innego procesu? Czy mogę je zatrzymać?

36

Czasami chcę przesłać kodowane kolorami wyjście dla procesu, np. grep ... ale kiedy potokuję to do innego procesu, np. sed, kody kolorów są tracone ...

Czy jest jakiś sposób na zachowanie tych kodów?

Oto przykład, który traci kolorowe wyjście:

echo barney | grep barney | sed -n 1,$\ p   
Peter.O
źródło
4
PS .. jako ogólna informacja .. Właśnie odkryłem, że lessmogę zaakceptować kolorową tree -C ~/ |less -Rls -lR --color=always . |less -R
metodę

Odpowiedzi:

40

Wiele programów, które generują kolorowe wydruki, wykrywa, czy pisze do TTY, i wyłącza kolory, jeśli tak nie jest. Jest tak, ponieważ kody kolorów są denerwujące, gdy chcesz tylko przechwycić tekst, więc próbują automatycznie „zrobić właściwą rzecz”.

Najprostszym sposobem na przechwycenie kolorowego wyniku z takiego programu jest nakazanie mu zapisania koloru, nawet jeśli nie jest on podłączony do TTY. Musisz przeczytać dokumentację programu, aby dowiedzieć się, czy ma tę opcję. (np. grepma --color=alwaysopcję.)

Możesz także użyć expectskryptu, unbufferaby utworzyć pseudo-tty:

echo barney | unbuffer grep barney | sed -n 1,$\ p
cjm
źródło
2
dzięki za informacje na temat wykrywania TTY i fałszywego usuwania bufora!
shellter
@cjm .. To nie działa tutaj (na Ubuntu 10.04 / bash 4.1.5) ... ale moje repozytorium 10.04 ma tylko wersję -dev i nic w backportach ... Tu jest trochę późno, więc spojrzę znowu jutro ... ale, jak już powiedziałeś, te programy do kolorowania prawdopodobnie przełączają się zgodnie z miejscem docelowym (mhhh, ale skąd wiedzą, że to nie jest ważne ... nieważne) ... i mogą mieć opcję wymuszenia to .. dzięki ,,,
Peter.O
@ Fred, zwykle używają isatty, aby dowiedzieć się, dokąd stdoutzmierza. Nie jestem do końca pewien, czy unbufferdziała, gdy wchodzisz do programu, jak i poza nim; Nie mam go tutaj, aby spróbować.
cjm
dziękuję za unbufferinformację, to pomaga wyjściu mojego bota IRC jak wyjście w powłoce.
LiuYan 研 研
4

Mi to pasuje ;-! (w obecnym środowisku MingW)

echo barney | grep --color=always barney | sed -n '1,$p'
**barney**

# barney wyświetla się jako czerwony tekst

$ grep --version
GNU grep 2.5.4

$ sed --version
GNU sed version 4.2.1
łobuz
źródło
@shellter ... tak, ten konkretny przykład grep też działa dla mnie .. Nie wiedziałem o tej opcji, dopóki nie opublikowałeś odpowiedzi, więc dziękuję za to ... Jednak. Nadal zastanawiam się, czy istnieje jakiś ogólny sposób, aby to zrobić ... np. tree is colorized a-la dircolors if the LS_COLORS environment variable is set and output is to tty ... Może (?) Istnieje sposób na nakłonienie potoku do myślenia, że ​​generuje on wynik TTY .. lub jakieś inne ogólne obejście. .
Peter.O
Właśnie sprawdziłem man tree... To też ma podobną opcję, -C... być może jest to wspólna cecha programów, które
wysyłają