2011-11-22 13 views
5

Mam skrypt, który używa kodów ucieczkowych do podświetlania dopasowań tekstowych na wyjściu. Wszystko jest dobre, z wyjątkiem sytuacji, gdy wyjście jest przesyłane do urządzenia less, które drukuje kody ucieczkibash - kody ucieczki kolorów

np.

$ echo -e "\033[31m -- Hello World! -- \033[m" 
-- Hello World! -- 

odprowadzone do less:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less 
ESC[31m -- Hello World! -- ESC[m 

Zastanawiałem się, jak inne narzędzia, takie jak ls, grep, etc są zdolne do wyświetlania w kolorze jeszcze wygląda dobrze, gdy rurami do less?

Odpowiedz

5

Większość wymienionych narzędzi nazywa się funkcją C isatty(), która określa, czy odpowiedni deskryptor pliku (w tym przypadku stdout) procesu przechodzi do terminala.

Jeśli wyjście dotyczy terminala, włącza kolor, podświetlenie, wydaje sygnały dźwiękowe lub inne funkcje, o których, jak sądzą, mógłby czerpać wartość człowiek. Jeśli nie ma terminala, wypisują tekst nieprzetworzony w celu przetrawienia innych narzędzi.

Kiedy piszesz

grep -v "Dogs" list-of-animals | less 

isatty() wezwanie od grep działa na deskryptorze pliku prowadzącej do rury, a nie terminalu. Tak więc zwraca zero, errno jest ustawione na EINVAL lub ENOTTY, a grep wysyła nieprzetworzony tekst za mniej.

+0

Rozumiem. Dziękuję za wyjaśnienie. – armandino

6

grep i przyjaciele wykrywają, czy wyjście jest do terminala. Kiedy są podłączone do mniej, to nie jest, więc wyłączają kolorowanie.

Sprawdź, czy wyjście jest terminalem.

pamiętać, że czasami to dość denerwujące, ponieważ Chcę mniej wyświetlać kolory:

alias less='less -SR' 
alias grep='grep --color=always' 

Również spojrzeć ANSIFilter na odwrocie: filtrowanie ANSI ucieka z istniejących strumieni (możesz go również użyć do tworzenia HTML, RTF i ewentualnie innych formatów z nich)

2

Jeśli chcesz pozwolić na przekazywanie mniejszych sekwencji kolorów do terminala:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

... lub jeśli chcesz przekazać wszystkie sekwencje:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

+0

+1 :-) także: google "kody ucieczki ansi", a: http://www.linuxfocus.org/English/May2004/article335.shtml – Tilo

9

Zastosowanie less -R lub dodać LESS=-R dla środowiska. To powoduje, że less przekazuje niektóre sekwencje specjalne (takie jak kolor) do terminala zamiast drukować je jako zwykłe znaki.

+0

to jest dokładnie to, czego szukałem, dziękuję. – jimh