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


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.