Công tắc grep --color = auto làm gì?


8

Hiệu ứng nào autolàm tùy chọn cho công --colortắc có trong grep? Khi nào grep quyết định tô màu các chuỗi phù hợp và khi nào thì không?

Câu trả lời:


12

Hành vi dự kiến

Với --color=auto, grep sẽ làm nổi bật các chuỗi khớp nếu (và chỉ khi) đầu ra được ghi trực tiếp vào thiết bị đầu cuối và thiết bị đầu cuối cho biết có khả năng hiển thị đầu ra màu.

Thông thường, --color=autolà những gì bạn muốn. Nếu, ví dụ, bạn sử dụng grep để khớp URL và chuyển nó thành Wget, Wget sẽ thấy \e[1;31mhttp://...thay vì URL thực tế (và bị sặc trên đó).

Các lệnh sau sẽ dẫn đến đầu ra màu:

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

Lệnh này, tuy nhiên, không nên:

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

Bất kỳ sự không nhất quán với hành vi này nên được coi là một lỗi.

Mã nguồn

Với --color=auto, phiên bản Grep cho Windows mới nhất (2.5.4) - cũng như phiên bản 2.5.4 gốc, nó dựa trên - tô màu đầu ra khi và chỉ khi điều kiện

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

là đúng, nghĩa là, nếu và chỉ khi đầu ra đang được ghi vào một thiết bị đầu cuối, biến môi trườngTERM được xác định và thiết bị đầu cuối không bị câm .

Điều này sẽ không tạo ra hành vi mong muốn trong Windows, vì TERMthông thường không được xác định. Một giải pháp dễ dàng cho vấn đề này là đặt TERM=windowsbảng điều khiển.

Phiên bản mới nhất của grep (2.14) khắc phục sự cố này bằng cách tô màu đầu ra khi và chỉ khi điều kiện

isatty(STDOUT_FILENO) && should_colorize()

là đúng, nơi should_colorize()được định nghĩa khác nhau cho POSIX và Win32:

Đối với trước đây, điều kiện tương đương với một trong 2.5.4; đối với cái sau, biến môi trường TERMkhông cần phải được đặt (chỉ là không thể dumb).


Làm thế nào để nó tìm ra nếu nó ghi vào thiết bị đầu cuối hay không?
Trolzen

1
Có chức năng C cho điều đó. Nếu bạn bao gồm tệp tiêu đề sdgstd.h, istty(stdout)trả về 0nếu đầu ra được chuyển hướng đến một tệp.
Dennis

Tôi thử nghiệm với các cổng windows của greplesstừ dự án GnuWin (gnuwin32.sourceforge.net). cmd.exeđược cải thiện với ansicontiện ích. less --color=autohoạt động như mong đợi: sử dụng màu khi không áp dụng chuyển hướng và không khi chuyển hướng đầu ra. Nhưng grep --color=autokhông in trình tự thoát trong cả hai trường hợp.
Trolzen

Tôi không thể hiểu tại sao điều này xảy ra. Tôi nghĩ rằng các tiện ích này có cùng mã ở cả phiên bản unix và windows và chúng khá cũ. Vì vậy, họ nên cư xử giống hệt nhau.
Trolzen

Đó là một lỗi trong grep của GnuWin32 rồi. Trên Ubuntu, nó hoạt động như tôi đã nêu chi tiết trong câu trả lời của mình. Mặc dù cả hai đều xuất phát từ cùng một mã nguồn, luôn có những điều chỉnh nhỏ phải được thực hiện nếu bạn định biên dịch trên nền tảng khác. Ngoài ra, hãy nhớ rằng phiên bản grep hiện tại của GnuWin32 là 2.5.4. Phiên bản mới nhất trên Ubuntu là 2.12.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.