Як перевірити, чи може баш друкувати кольори


62

Я хочу знати, чи є спосіб перевірити, чи може моя програма виводити термінальний висновок, використовуючи кольори чи ні.

Виконуючи такі команди, як lessі дивлячись на результат програми, яка виводить кольори, вихід відображається неправильно, як

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

Дякую



Відповіді:


68

Ідея полягає в тому, щоб моя програма знала, що не забарвлювати вихід, якщо програма не може надрукувати, скажімо, вести реєстрацію виводу з допомогою завдання cron у файл, не потрібно реєструвати кольоровий вихід, але при запуску вручну я люблю переглядати вихід кольоровий

На якій мові ви пишете свою заяву?

Нормальний підхід полягає в тому, щоб перевірити, чи вихідний пристрій tty, і якщо він є, перевірити, чи підтримує цей тип терміналу кольори.

В bash, це виглядатиме так

# 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.

На мові C потрібно зробити набагато більше набору тексту, але можна досягти такого ж результату, використовуючи isatty та функції, перелічені в man 3 terminfo.


^^ що ^^ було саме те , що я шукав. Дякую.
— Тім Кеннеді

Дякую за підказку про tput. Це справді чудова відповідь.
— AmadeusDrZaius

24

Цього має бути достатньо:

$ tput colors

кольори tput пояснено:

Якщо ви подивитеся на сторінку, ви помітите це:

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

І ...

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

Термінcap colorsзнаходиться в базі даних terminfo, тому ви можете запитати його. Якщо у вас є нульовий статус виходу, тоді термінcap збирається. Але якщо у вас є щось на зразок:

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

Це показує, що unknowntermcap не існує. Отже, це:

$ tput colors
8
$ echo $?
0

Показує, що ваша команда була правильною.

Інші корисні способи:

  • У C ви можете просто використовувати isatty і побачити, чи це TTY
  • Подивіться, чи це тупий термінал, який шукає змінну $ TERM

Ура


colorsне зафіксовано на tputсторінці man (!), тому я повинен шукати число> = 8 у stdout або зворотний код 0?
— l0b0

Здавалося, очевидним, але ваш коментар показує, що це не так. Я додаю цю інформацію (коротко, кольори - це можливість бази даних terminfo)
— D4RIO

1
colorsМожливість документально підтверджена в terminfo В (5) . Тестування з використанням tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colorsпередбачає спільні цінності не є -1(без кольору підтримки) і 8(8 кольорів). Зауважте, що це застосовується лише після перевірки, що вихідний пристрій є терміналом (наприклад, [ -t 1 ]або isatty).
— Мікель

Зауважте, що tput colorsповертає те, що локальна база терміналів думає про термінал. Це може або не відповідає тому, що термінал може насправді робити, особливо для типу терміналу, xtermякий є у багатьох варіантах (починаючи від чорного та білого до 256 кольорів).
— Жиль

7

Ідея полягає в тому, щоб моя програма знала, що не забарвлювати вихід, якщо програма не може надрукувати, скажімо, вести реєстрацію виводу через роботу cron у файл, не потрібно реєструвати кольоровий вихід, але при запуску вручну я люблю переглядати вихід кольоровий

У цьому випадку використання те, що зазвичай роблять програми (наприклад, GNU ls або GNU grep with --color=auto), - це використовувати кольори, якщо їх вихід надходить на термінал, а жодні кольори - інакше. Термінали, які не підтримують послідовність зміни кольорів ANSI, є досить рідкісними, щоб прийнятно зробити так, щоб їхні користувачі могли змінити вибір за замовчуванням. У будь-якому випадку переконайтеся, що у вашій програмі є можливість вмикати або вимикати кольори.

У сценарії оболонки використовуйте [ -t 1 ]для перевірки, чи стандартний вихід є терміналом.

# 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

З програми, що використовує API C, дзвоніть 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

Запускаючи команди як менше, і дивлячись на вихід програми, яка виводить кольори, вихід відображається неправильно, як

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

Спробуйте використовувати less --RAW-CONTROL-CHARS.

У цьому прикладі я використовую logtool , який друкує вихід, використовуючи кольори.

Без - ЧЕРВО-КОНТРОЛЬНІ ХАРАКТЕРИ:

$ 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

З - RAW-CONTROL-CHAR (Уявіть, що це в досить гарних кольорах. Також я не впевнений, чому ^Gце відображається.):

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

2

Це було б виною того, що lessне налаштовано інтерпретувати втечі ANSI; шукати Rв $LESSOPTS. Щодо визначення того, чи знає система, що ваш термінал може мати справу з кольорами, tput colorsвиводить або кількість кольорів, які він підтримує, або -1якщо вони не підтримують кольори. (Зверніть увагу , що деякі термінали можуть використовувати xtermзамість того , xterm-colorяк їх опис терміналу, але до сих пір підтримують кольору.)


Ідея полягає в тому, щоб моя програма знала, що не забарвлювати вихід, якщо програма не може надрукувати, скажімо, вести реєстрацію виводу через роботу cron у файл, не потрібно реєструвати кольоровий вихід, але при запуску вручну я люблю переглядати вихід кольоровий
— Анджело Варгас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.