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


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.