Có một số biến môi trường?
Đúng. Đây là TERM
biế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
TERM
mô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
TERMCAP
biế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_colors
lĩ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ó -m
hoặc -mono
gắ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_foreground
và set_a_background
cá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
ls
có --color
tùy chọn dòng lệnh.
- BSD
ls
xem 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 -G
tù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 grep
thự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 TERM
biế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 TERM
biế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 TERM
là của bạn xterm-mono
, GNU grep
sẽ quyết định phát ra màu sắc, mặc dù các chương trình khác như vim
sẽ không.
Cổng Win32 của nó có mã này , cho phép thông báo khi TERM
biế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 grep
vấn đề về màu sắc của GNU
Sự thông minh của GNU grep
thự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_margin
trườ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 grep
khô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