Cara memeriksa apakah bash dapat mencetak warna

62

Saya ingin tahu apakah ada cara untuk memeriksa apakah program saya dapat menampilkan keluaran terminal menggunakan warna atau tidak.

Menjalankan perintah suka lessdan melihat keluaran dari program yang keluarannya menggunakan warna, keluarannya ditampilkan salah

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

Terima kasih

Angelo Vargas
sumber

Jawaban:

68

Idenya adalah agar aplikasi saya tahu untuk tidak mewarnai keluaran jika program tidak dapat mencetak, katakanlah, mencatat keluaran dari melalui tugas cron ke sebuah file, tidak perlu mencatat keluaran berwarna, tetapi ketika berjalan secara manual, saya suka melihat output berwarna

Anda menggunakan bahasa apa aplikasi Anda?

Pendekatan normal adalah memeriksa apakah perangkat keluaran adalah tty, dan jika ya, periksa apakah jenis terminal tersebut mendukung warna.

Dalam bash, itu akan terlihat seperti

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

Di C, Anda harus melakukan lebih banyak pengetikan, tetapi dapat mencapai hasil yang sama menggunakan isatty dan fungsi-fungsi yang terdaftar di man 3 terminfo.

Mikel
sumber
^^ itu ^^ tepat seperti yang saya cari. Terima kasih.
Tim Kennedy
Terima kasih atas petunjuk tentang tput. Ini jawaban yang sangat bagus.
AmadeusDrZaius
24

Ini seharusnya cukup:

$ tput colors

warna tput menjelaskan:

Jika Anda melihat halaman manual, Anda akan melihat ini:

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

Dan...

   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 colorsada di database terminfo, jadi Anda bisa memintanya. Jika Anda memiliki status keluar nol, maka termcap dikompilasi. Tetapi jika Anda memiliki sesuatu seperti:

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

Ini menunjukkan bahwa tidak diketahui kemungkinan tidak ada. Jadi ini:

$ tput colors
8
$ echo $?
0

Menunjukkan bahwa perintah Anda benar.

Cara bermanfaat lainnya:

  • Di C, Anda bisa menggunakan isatty dan melihat apakah itu TTY
  • Lihat apakah itu terminal bodoh yang mencari variabel $ TERM

Tepuk tangan

D4RIO
sumber
colorstidak didokumentasikan dalam tputhalaman manual (!), jadi haruskah saya mencari angka> = 8 di stdout atau kode pengembalian 0?
l0b0
Tampak jelas, tetapi komentar Anda menunjukkan bahwa itu tidak benar. Saya menambahkan info itu (secara singkat, warna adalah kemampuan basis data terminfo)
D4RIO
1
The colorskemampuan didokumentasikan dalam terminfo (5) . Pengujian menggunakan tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colorsmenunjukkan nilai-nilai umum adalah -1(tidak ada dukungan warna) dan 8(8 warna). Perhatikan bahwa ini hanya berlaku setelah memeriksa perangkat keluaran adalah terminal (misalnya [ -t 1 ]atau isatty).
Mikel
Perhatikan bahwa tput colorsmengembalikan apa yang dipikirkan database terminal lokal tentang terminal. Ini mungkin atau mungkin tidak sesuai dengan apa yang sebenarnya dapat dilakukan terminal, terutama untuk jenis terminal seperti xtermyang datang dalam banyak varian (mulai dari hitam dan putih hingga 256 warna).
Gilles 'SO- stop being evil'
7

Idenya adalah agar aplikasi saya tahu untuk tidak mewarnai keluaran jika program tidak dapat mencetak, katakanlah, mencatat keluaran dari melalui tugas cron ke file, tidak perlu mencatat keluaran berwarna, tetapi ketika berjalan secara manual, saya suka melihat output berwarna.

Untuk kasus penggunaan ini, program apa yang biasanya dilakukan (misalnya GNU ls atau GNU grep with --color=auto) adalah menggunakan warna jika outputnya menuju ke terminal, dan tidak ada warna sebaliknya. Terminal yang tidak mendukung sekuens pengubah warna ANSI cukup langka sehingga dapat diterima pengguna untuk mengabaikan pilihan default. Bagaimanapun, pastikan aplikasi Anda memiliki opsi untuk mengaktifkan atau menonaktifkan warna.

Dalam skrip shell, gunakan [ -t 1 ]untuk menguji apakah output standar adalah terminal.

# 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

Dari program yang menggunakan C API, panggil 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);
Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Menjalankan perintah seperti kurang dan melihat output dari program yang menggunakan warna, hasilnya ditampilkan salah

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

Coba gunakan less --RAW-CONTROL-CHARS.

Dalam contoh ini saya menggunakan logtool , yang mencetak keluaran menggunakan warna.

Tanpa --RAW-CONTROL-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

Dengan --RAW-CONTROL-CHAR (Bayangkan ini dalam warna yang cantik. Juga, saya tidak yakin mengapa itu ^Gditampilkan.):

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

Itu akan menjadi kesalahan karena lesstidak diatur untuk menafsirkan pelarian ANSI; mencari Rdi $LESSOPTS. Sedangkan untuk menentukan apakah sistem tahu terminal Anda dapat menangani warna, tput colorsakan menampilkan jumlah warna yang didukung atau -1jika tidak mendukung warna. (Perhatikan bahwa beberapa terminal mungkin menggunakan xtermbukan xterm-colorsebagai deskripsi terminal mereka, tetapi masih mendukung warna.)

geekosaurus
sumber
Idenya adalah agar aplikasi saya tahu untuk tidak mewarnai keluaran jika program tidak dapat mencetak, katakanlah, mencatat keluaran dari melalui tugas cron ke file, tidak perlu mencatat keluaran berwarna, tetapi ketika berjalan secara manual, saya suka melihat output berwarna.
Angelo Vargas