Có một số biến môi trường?
Đúng. Đây là TERMbiến môi trường. Điều này là do có một số điều được sử dụng như một phần của quá trình quyết định.
Thật khó để khái quát ở đây, bởi vì không phải tất cả các chương trình đều đồng ý về một sơ đồ quyết định duy nhất. Trong thực tế GNU grep, được đề cập trong câu trả lời của M. Kitt, là một ví dụ điển hình về một ngoại lệ sử dụng quy trình quyết định hơi bất thường với kết quả không mong muốn. Về mặt rất chung chung, do đó:
- Đầu ra tiêu chuẩn phải là một thiết bị đầu cuối, như được xác định bởi
isatty().
- Chương trình phải có khả năng tra cứu bản ghi cho loại thiết bị đầu cuối trong cơ sở dữ liệu termcap / terminfo.
- Vì vậy, phải có một loại thiết bị đầu cuối để tìm kiếm. Biến
TERMmôi trường phải tồn tại và giá trị của nó phải khớp với bản ghi cơ sở dữ liệu.
- Do đó phải có một cơ sở dữ liệu terminfo / termcap. Trên một số triển khai của hệ thống con, vị trí của cơ sở dữ liệu termcap có thể được chỉ định bằng cách sử dụng
TERMCAPbiến môi trường. Vì vậy, trên một số triển khai có một biến môi trường thứ hai .
- Bản ghi termcap / terminfo phải nói rằng loại thiết bị đầu cuối hỗ trợ màu sắc. Có một
max_colorslĩnh vực trong terminfo. Nó không được đặt cho các loại thiết bị đầu cuối không thực sự có khả năng màu. Thật vậy, có một quy ước terminfo rằng đối với mỗi loại thiết bị đầu cuối có thể tách rời, có một bản ghi khác có -mhoặc -monogắn vào tên không có khả năng màu.
- Bản ghi termcap / terminfo phải cung cấp cách để chương trình thay đổi màu sắc. Có
set_a_foregroundvà set_a_backgroundcác lĩnh vực trong terminfo.
Nó phức tạp hơn một chút so với chỉ kiểm tra isatty(). Nó được làm thêm phức tạp bởi một vài điều:
- Một số ứng dụng thêm tùy chọn dòng lệnh hoặc cờ cấu hình ghi đè
isatty()kiểm tra, để chương trình luôn luôn hoặc không bao giờ giả định rằng nó có thiết bị đầu cuối (có thể chia sẻ) làm đầu ra. Ví dụ như:
- GNU
lscó --colortùy chọn dòng lệnh.
- BSD
lsxem xét các biến môi trường CLICOLOR(nghĩa là không có nghĩa là không bao giờ ) và CLICOLOR_FORCE( luôn luôn có nghĩa là sự hiện diện của nó ) và cũng sử dụng -Gtùy chọn dòng lệnh.
- Một số ứng dụng không sử dụng termcap / terminfo và có các phản hồi mong muốn về giá trị của
TERM.
- Không phải tất cả các thiết bị đầu cuối đều sử dụng trình tự ECMA-48 hoặc ISO 8613-6 SGR, được đặt tên hơi sai là "trình tự thoát ANSI", để thay đổi màu sắc. Cơ chế termcap / terminfo trên thực tế được thiết kế để cách ly các ứng dụng khỏi kiến thức trực tiếp về các chuỗi điều khiển chính xác. (Hơn nữa, có một lập luận cho rằng không ai sử dụng trình tự ISO 8613-6 SGR, bởi vì mọi người đều đồng ý về lỗi sử dụng dấu chấm phẩy làm dấu phân cách cho chuỗi SGR màu RGB. Tiêu chuẩn thực sự chỉ định dấu hai chấm.)
Như đã đề cập, GNU grepthực sự thể hiện một số trong những phức tạp bổ sung này. Nó không tham khảo termcap / terminfo, cung cấp các chuỗi điều khiển để phát ra và tạo ra phản ứng với TERMbiến môi trường.
Cổng Linux / Unix của nó có mã này , cho phép chỉ thông báo khi TERMbiến môi trường tồn tại và giá trị của nó không khớp với tên cứng dumb:
int
nên_colorize (void)
{
char const * t = getenv ("HẠN");
trả về t && strcmp (t, "câm")! = 0;
}
Vì vậy, ngay cả khi TERMlà của bạn xterm-mono, GNU grepsẽ quyết định phát ra màu sắc, mặc dù các chương trình khác như vimsẽ không.
Cổng Win32 của nó có mã này , cho phép thông báo khi TERMbiến môi trường không tồn tại hoặc khi nó tồn tại và giá trị của nó không khớp với tên cứng dumb:
int
nên_colorize (void)
{
char const * t = getenv ("HẠN");
trở về ! (t && strcmp (t, "câm") == 0);
}
Các grepvấn đề về màu sắc của GNU
Sự thông minh của GNU grepthực sự khét tiếng. Bởi vì nó không thực sự làm tốt công việc xây dựng đầu ra thiết bị đầu cuối, mà chỉ thổi vào một vài chuỗi điều khiển cứng ở các điểm khác nhau trong đầu ra với hy vọng là đủ tốt, nó thực sự hiển thị đầu ra không chính xác trong một số trường hợp nhất định.
Những trường hợp này là nơi nó phải ghi lại một cái gì đó ở rìa bên phải của thiết bị đầu cuối. Các chương trình làm đầu ra thiết bị đầu cuối đúng cách phải tính đến lề phải tự động. Ngoài khả năng nhỏ là thiết bị đầu cuối có thể không có chúng (viz auto_right_margintrường trong terminfo), hành vi của các thiết bị đầu cuối có lề phải tự động thường tuân theo tiền lệ DEC VT của gói chờ xử lý . GNU grepkhông giải thích cho điều này, hoàn toàn mong đợi việc bọc dòng ngay lập tức và đầu ra màu của nó bị sai.
Đầu ra màu không phải là một điều đơn giản.
đọc thêm