grep --color dodaje kod ANSI ESC [K - To może zmienić wyświetlany tekst

9

Dlaczego grep dodaje kod ANSI \e[Kdo kolorowych wyników? Nie rozumiem sensu, ale oczywiście programiści mogą. Jest to kod terminala ANSI / VT100, który służy do „czyszczenia linii od aktualnej pozycji kursora do końca linii” .

W marginesowym przypadku grep może powodować „znikanie” tekstu z wyświetlacza terminala. Na przykład:

echo -e "ab\rc"
echo -e "ab\rc" |grep --color=always "c"

Proste echo wyświetla :,cb ale kolorowy wyświetlacz pokazuje:c

Podstawowy zakodowany tekst to: echo -e 'ab\r\033[01;31m\033[Kc\033[m\033[K' Jednak bez \e[Kkodów echo -e 'ab\r\033[01;31mc\033[m'działa zgodnie z oczekiwaniami!

Jaki jest powód włączenia grep do tych \e[Kkodów. Piszę skrypt, aby umożliwić nakładanie z drugim przejściu kolorowania , na przykład: c=--color=always; ls $c /bin/gzip | grep $c 'z'. więc muszę zrozumieć, dlaczego grep używa \e[K.

Peter.O
źródło

Odpowiedzi:

11

Możesz zmienić to zachowanie, ustawiając GREP_COLORSzmienną środowiskową:

export GREP_COLORS=ne
echo -e "ab\rc" | grep --color=always "c"

Ze strony podręcznika grep:

          ne     Boolean  value  that prevents clearing to the end of line
                 using Erase in Line (EL) to Right  (\33[K)  each  time  a
                 colorized  item  ends.   This  is  needed on terminals on
                 which EL is not supported.  It  is  otherwise  useful  on
                 terminals  for  which  the back_color_erase (bce) boolean
                 terminfo capability  does  not  apply,  when  the  chosen
                 highlight colors do not affect the background, or when EL
                 is too slow or causes too much flicker.  The  default  is
                 false (i.e., the capability is omitted).

Odbywa się to przede wszystkim w celu ustawienia prawidłowego koloru tła reszty linii, na wypadek gdyby została ona wcześniej zmieniona (choć domyślnie tak nie jest; ktoś może to ustawić we własnych ustawieniach).

Możesz także zagrać z innymi opcjami, które można ustawić GREP_COLORS; zobacz stronę podręcznika, aby uzyskać szczegółowe informacje.

Michael Hampton
źródło