Cách kiểm tra nếu bash có thể in màu


62

Tôi muốn biết liệu có cách nào để kiểm tra xem chương trình của tôi có thể xuất đầu ra đầu cuối bằng màu sắc hay không.

Chạy các lệnh như lessvà nhìn vào đầu ra từ một chương trình xuất ra bằng màu sắc, đầu ra được hiển thị sai, như

[ESC[0;32m0.052ESC[0m ESC[1;32m2,816.00 kbESC[0m]

Cảm ơn



Câu trả lời:


68

Ý tưởng là để ứng dụng của tôi biết không tô màu đầu ra nếu chương trình không thể in, giả sử, ghi nhật ký đầu ra từ một công việc định kỳ vào một tệp, không cần phải ghi nhật ký màu, nhưng khi chạy thủ công, tôi muốn xem đầu ra màu

Ngôn ngữ nào bạn đang viết đơn đăng ký?

Cách tiếp cận thông thường là kiểm tra xem thiết bị đầu ra có phải là tty không, và nếu có, hãy kiểm tra xem loại thiết bị đầu cuối đó có hỗ trợ màu không.

Trong bashđó, sẽ giống như

# check if stdout is a terminal...
if test -t 1; then

    # see if it supports colors...
    ncolors=$(tput colors)

    if test -n "$ncolors" && test $ncolors -ge 8; then
        bold="$(tput bold)"
        underline="$(tput smul)"
        standout="$(tput smso)"
        normal="$(tput sgr0)"
        black="$(tput setaf 0)"
        red="$(tput setaf 1)"
        green="$(tput setaf 2)"
        yellow="$(tput setaf 3)"
        blue="$(tput setaf 4)"
        magenta="$(tput setaf 5)"
        cyan="$(tput setaf 6)"
        white="$(tput setaf 7)"
    fi
fi

echo "${red}error${normal}"
echo "${green}success${normal}"

echo "${green}0.052${normal} ${bold}${green}2,816.00 kb${normal}"
# etc.

Trong C, bạn phải gõ nhiều hơn, nhưng có thể đạt được kết quả tương tự bằng cách sử dụng isatty và các chức năng được liệt kê trong man 3 terminfo.


^^ đó ^^ chính xác là những gì tôi đang tìm kiếm. Cảm ơn.
Tim Kennedy

Cảm ơn cho gợi ý về tput. Đây là một câu trả lời thực sự tuyệt vời.
AmadeusDrZaius

24

Điều này là đủ:

$ tput colors

màu sắc giải thích:

Nếu bạn nhìn vào trang chủ, bạn sẽ nhận thấy điều này:

SYNOPSIS
       tput [-Ttype] capname [parms ... ]

Và ...

   capname
          indicates the capability from the terminfo database.  When term
          cap  support is compiled in, the termcap name for the capability
          is also accepted.

Termcap colorsnằm trong cơ sở dữ liệu terminfo, vì vậy bạn có thể yêu cầu nó. Nếu bạn có trạng thái thoát không, thì thuật ngữ được biên dịch. Nhưng nếu bạn có một số thứ như:

$ tput unknowntermcap
tput: unknown terminfo capability 'unknowntermcap'
$ echo $?
4

Điều này cho thấy unknntermcap không tồn tại. Vì vậy, đây:

$ tput colors
8
$ echo $?
0

Cho thấy lệnh của bạn đã đúng.

Những cách hữu ích khác:

  • Trong C, bạn chỉ có thể sử dụng isatty và xem nếu đó là TTY
  • Xem nếu đó là một thiết bị đầu cuối câm tìm biến $ TERM

Chúc mừng


colorskhông được ghi lại trong tputtrang man (!), vậy tôi nên tìm số> = 8 trong thiết bị xuất chuẩn hoặc mã trả về 0?
l0b0

Có vẻ rõ ràng, nhưng nhận xét của bạn cho thấy rằng nó không phải. Tôi đang thêm thông tin đó (một cách ngắn gọn, màu sắc là khả năng của cơ sở dữ liệu terminfo)
D4RIO

1
Các colorskhả năng được ghi chép lại trong terminfo (5) . Thử nghiệm sử dụng tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colorscho thấy giá trị chung là -1(không hỗ trợ màu sắc) và 8(8 màu). Lưu ý rằng điều này chỉ áp dụng sau khi kiểm tra thiết bị đầu ra là thiết bị đầu cuối (ví dụ [ -t 1 ]hoặc isatty).
Mikel

Lưu ý rằng tput colorstrả về những gì cơ sở dữ liệu đầu cuối cục bộ nghĩ về thiết bị đầu cuối. Điều này có thể hoặc không thể tương ứng với những gì thiết bị đầu cuối thực sự có thể làm, đặc biệt đối với loại thiết bị đầu cuối giống như xtermcó nhiều biến thể (từ đen và trắng đến 256 màu).
Gilles 'SO- ngừng trở nên xấu xa'

7

Ý tưởng là để ứng dụng của tôi biết không tô màu đầu ra nếu chương trình không thể in, giả sử, ghi nhật ký đầu ra từ một công việc định kỳ vào một tệp, không cần phải ghi nhật ký màu, nhưng khi chạy thủ công, tôi muốn xem đầu ra màu.

Đối với trường hợp sử dụng này, những chương trình thường làm (ví dụ GNU ls hoặc GNU grep với --color=auto) là sử dụng màu sắc nếu đầu ra của chúng đi đến một thiết bị đầu cuối và không có màu nào khác. Các thiết bị đầu cuối không hỗ trợ các chuỗi thay đổi màu ANSI hiếm khi đủ để người dùng của họ ghi đè lên lựa chọn mặc định. Trong mọi trường hợp, hãy đảm bảo ứng dụng của bạn có tùy chọn để bật hoặc tắt màu.

Trong tập lệnh shell, sử dụng [ -t 1 ]để kiểm tra xem đầu ra tiêu chuẩn có phải là thiết bị đầu cuối không.

# option processing has set $color to yes, no or auto
if [ $color = auto ]; then
  if [ -t 1 ]; then color=yes; else color=no; fi
fi

Từ một chương trình sử dụng API C, hãy gọi isatty(1).

# option processing has set use_color to 0 for no, 1 for yes or 2 for auto
if (use_color == 2) use_color = isatty(1);

5

Chạy các lệnh như ít hơn và nhìn vào đầu ra từ một chương trình xuất ra bằng màu sắc, đầu ra được hiển thị sai, như

[ESC [0; 32m0.052ESC [0m ESC [1; 32m2,816.00 kbESC [0m]

Hãy thử sử dụng less --RAW-CONTROL-CHARS.

Trong ví dụ này tôi đang sử dụng logtool , in ra đầu ra bằng màu sắc.

Không có - RAW-KIỂM SOÁT-CHARS:

$ head -20 /var/log/messages | logtool | less
ESC[0mESC[0;37mMar 20 11:43:52ESC[0mESC[1;36m host1ESC[0mESC[0;37m rsyslogd:ESC[0m ^GESC[0;31mlast message repeated 14 timesESC[0mESC[0m

Với --RAW-CONTROL-CHAR (Hãy tưởng tượng đây là màu sắc đẹp. Ngoài ra, tôi không chắc tại sao nó ^Glại được hiển thị.):

$ head -20 /var/log/messages | logtool | less --RAW-CONTROL-CHARS
Mar 20 11:43:52 host1 rsyslogd: ^Glast message repeated 14 times

2

Đó sẽ là lỗi của việc lesskhông được thiết lập để giải thích các lối thoát ANSI; tìm kiếm Rtrong $LESSOPTS. Để xác định xem hệ thống có biết thiết bị đầu cuối của bạn có thể xử lý màu hay không, tput colorssẽ xuất ra số lượng màu mà nó hỗ trợ hoặc -1nếu nó không hỗ trợ màu. (Lưu ý rằng một số thiết bị đầu cuối có thể sử dụng xtermthay vì xterm-colornhư mô tả thiết bị đầu cuối của chúng, nhưng vẫn hỗ trợ màu sắc.)


Ý tưởng là để ứng dụng của tôi biết không tô màu đầu ra nếu chương trình không thể in, giả sử, ghi nhật ký đầu ra từ một công việc định kỳ vào một tệp, không cần phải ghi nhật ký màu, nhưng khi chạy thủ công, tôi muốn xem đầu ra màu.
Angelo Vargas

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.