Co robi przełącznik grep --color = auto?

8

Jaki efekt ma autoopcja --colorprzełącznika w grep? Kiedy grep decyduje się pokolorować pasujące ciągi, a kiedy nie?

Trolzen
źródło

Odpowiedzi:

12

Spodziewane zachowanie

Za pomocą --color=auto, grep podświetli pasujące ciągi, jeśli (i tylko wtedy), gdy dane wyjściowe są zapisywane bezpośrednio do terminala, a wspomniany terminal może wyświetlać kolorowe dane wyjściowe.

Zwykle --color=autojest to, czego chcesz. Jeśli np. Użyjesz grep, aby dopasować adres URL i potokujesz go do Wget, Wget zobaczy \e[1;31mhttp://...zamiast rzeczywistego adresu URL (i będzie go dusić).

Następujące polecenia powinny dać kolorowe wydruki:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

To polecenie nie powinno jednak:

echo Super User | grep --color=auto Super | cat

Wszelkie niespójności z tym zachowaniem należy uznać za błąd.

Kod źródłowy

Dzięki --color=autonajnowszej wersji Grep dla Windows (2.5.4) - jak również oryginalnej wersji 2.5.4, na której jest oparty - pokoloruj wyjście wtedy i tylko wtedy, gdy warunek

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

ma wartość true, tzn. jeśli i tylko jeśli dane wyjściowe są zapisywane na terminalu, zmienna środowiskowaTERM jest zdefiniowana, a terminal nie jest głupi .

Nie spowoduje to pożądanego zachowania w systemie Windows, ponieważ TERMzwykle nie jest zdefiniowane. Łatwym rozwiązaniem tego problemu jest ustawienie TERM=windowsw panelu sterowania.

Najnowsza wersja grep (2.14) rozwiązuje ten problem, kolorując dane wyjściowe wtedy i tylko wtedy, gdy warunek

isatty(STDOUT_FILENO) && should_colorize()

ma wartość true, gdzie should_colorize()jest różnie zdefiniowany dla POSIX i Win32:

W przypadku tych pierwszych warunek jest równoważny warunkowi 2.5.4; w drugim przypadku zmienna środowiskowa TERMnie musi być ustawiona (po prostu nie może być dumb).

Dennis
źródło
Jak się dowie, czy pisze na terminalu, czy nie?
Trolzen
1
Jest do tego funkcja C. Jeśli dołączasz plik nagłówka sdgstd.h, istty(stdout)zwraca, 0jeśli dane wyjściowe zostaną przekierowane do pliku.
Dennis
Eksperymentuję z portami Windows grepi lessprojektu GnuWin (gnuwin32.sourceforge.net). cmd.exezostał ulepszony o ansiconnarzędzie. less --color=autodziała zgodnie z oczekiwaniami: używa koloru, gdy przekierowanie nie jest stosowane, i nie działa, gdy przekierowywane jest wyjście. Ale grep --color=autonie drukuje sekwencji ucieczki w obu przypadkach.
Trolzen
Nie rozumiem, dlaczego tak się dzieje. Myślałem, że te narzędzia mają ten sam kod, zarówno w wersjach Unix, jak i Windows i są dość stare. Powinni więc zachowywać się identycznie.
Trolzen
To błąd w grepie GnuWin32. W Ubuntu zachowuje się tak, jak opisano szczegółowo w mojej odpowiedzi. Chociaż oba pochodzą z tego samego kodu źródłowego, zawsze trzeba dokonać drobnych korekt, jeśli zamierzasz kompilować na innej platformie. Pamiętaj również, że aktualna wersja grep GnuWin32 to 2.5.4. Najnowsza wersja Ubuntu to 2.12.
Dennis