2011-11-22 34 views
5

Tôi có một tập lệnh sử dụng mã thoát để đánh dấu các kết quả khớp văn bản trong đầu ra của nó. Tất cả đều tốt trừ khi đầu ra được chuyển đến less, in các mã thoátbash - mã thoát màu

ví dụ:

$ echo -e "\033[31m -- Hello World! -- \033[m" 
-- Hello World! -- 

Pied để less:

$ echo -e "\033[31m -- Hello World! -- \033[m" | less 
ESC[31m -- Hello World! -- ESC[m 

tôi đã tự hỏi các công cụ như thế nào khác như ls, grep, vv có thể sản lượng trong màu nhưng có vẻ tốt khi đường ống để less?

Trả lời

5

Hầu hết các công cụ bạn đề cập gọi hàm isatty C() xác định xem bộ mô tả tệp có liên quan (trong trường hợp này là stdout) của quá trình đang đi đến một thiết bị đầu cuối hay không.

Nếu đầu ra dành cho thiết bị đầu cuối, chúng cho phép tô màu, làm nổi bật, tạo tiếng bíp hoặc bất kỳ tính năng nào khác mà người dùng cho rằng người dùng sẽ lấy được giá trị. Nếu không có thiết bị đầu cuối, chúng sẽ xuất văn bản thô cho việc tiêu hóa các công cụ khác.

Khi bạn viết

grep -v "Dogs" list-of-animals | less 

Các isatty() cuộc gọi từ grep chạy trên bộ mô tả tập tin dẫn đến việc đường ống, không thiết bị đầu cuối của bạn. Vì vậy, nó trả về không, errno được đặt thành EINVAL hoặc ENOTTY và grep xuất ra văn bản thô phù hợp với ít hơn.

+0

OK. Cảm ơn lời giải thích. – armandino

6

grep và bạn bè phát hiện xem đầu ra có đến thiết bị đầu cuối hay không. Khi đường ống đến ít hơn, nó không phải là, vì vậy họ vô hiệu hóa màu.

Nhìn vào isatty để kiểm tra xem đầu ra có phải là thiết bị đầu cuối hay không.

Lưu ý rằng đôi khi tôi tìm thấy điều này khá khó chịu vì tôi muốn ít để hiển thị màu sắc:

alias less='less -SR' 
alias grep='grep --color=always' 

Ngoài ra nhìn vào ANSIFilter cho điều ngược lại: để lọc ANSI thoát ra khỏi hiện luồng (bạn cũng có thể sử dụng nó để tạo HTML, RTF và các định dạng khác có thể từ chúng)

2

Nếu bạn muốn cho phép ít hơn để vượt qua chuỗi thoát màu đến thiết bị đầu cuối:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -R

... hoặc nếu bạn muốn vượt qua tất cả escape sequences:

> echo -e "\033[31m -- Hello World! -- \033[m" | less -r

+0

+1 :-) cũng: google "mã thoát ansi" và: http://www.linuxfocus.org/English/May2004/article335.shtml – Tilo

9

Sử dụng less -R hoặc thêm LESS=-R đối với môi trường. Điều này yêu cầu rằng less chuyển một số chuỗi thoát (chẳng hạn như màu) cho thiết bị đầu cuối thay vì in chúng dưới dạng ký tự thông thường.

+0

đây chính xác là những gì tôi đang tìm kiếm cảm ơn. – jimh

Các vấn đề liên quan