Bash'in renkleri basıp basamayacağı nasıl kontrol edilir


62

Programımın terminal çıktısının renk kullanarak çıkıp çıkmadığını kontrol etmenin bir yolu olup olmadığını bilmek istiyorum.

Gibi komutları çalıştıran lessve çıktıları renkleri kullanarak çıkaran bir programdan çıktılara bakarak, çıktı yanlış görüntüleniyor

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

Teşekkürler



Yanıtlar:


68

Benim fikrim, programın yazdıramaması durumunda çıktıyı renklendirmemeyi bilmesi, yani, çıktıyı bir cron işinden bir dosyaya kaydetme, renkli çıktı kaydetmeye gerek kalmaması, ancak manuel olarak çalışırken görüntülemeyi seviyorum çıktı renkli

Başvurunuzu hangi dilde yazıyorsunuz?

Normal yaklaşım, çıkış cihazının bir tty olup olmadığını kontrol etmek ve eğer öyle ise, bu terminal türünün renkleri destekleyip desteklemediğini kontrol etmektir.

İçinde bash, bu gibi olurdu

# 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'de daha çok yazarak yapmanız gerekir, ancak isatty ve içinde listelenen işlevleri kullanarak aynı sonucu elde edebilirsiniz man 3 terminfo.


^^ bu ^^ tam olarak aradığım şeydi. Teşekkürler.
Tim Kennedy,

Tput hakkındaki ipucu için teşekkürler. Bu gerçekten harika bir cevap.
AmadeusDrZaius

24

Bu yeterli olmalı:

$ tput colors

tput renkler açıkladı:

Man sayfasına bakarsanız, şunu fark edeceksiniz:

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

Ve...

   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 colorsterminfo veritabanında, bu yüzden isteyebilirsiniz. Sıfır çıkış durumunuz varsa, o zaman termcap derlenir. Fakat eğer böyle bir şeyiniz varsa:

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

Bu, bilinmeyen bir sorunun olmadığını gösteriyor. Yani, bu:

$ tput colors
8
$ echo $?
0

Komutunun haklı olduğunu gösterir.

Diğer faydalı yollar:

  • C'de, sadece isatty kullanabilirsiniz ve bir TTY olup olmadığını görebilirsiniz
  • $ TERM değişkeni arayan aptal bir terminal olup olmadığını görün

Şerefe


colorstputman sayfası (!) belgesinde belgelenmemişse, stdout'ta> = 8 ya da 0 dönüş kodu mı arayayım?
l0b0

Açık görünüyordu, ancak yorumunuz olmadığını gösteriyor. Bu bilgiyi ekliyorum (kısaca renkler terminfo veritabanının bir özelliğidir)
D4RIO

1
colorsYeteneği belgelenen Terminfo (5) . Kullanılarak test tput -T dumb colors, tput -T vt220 colors, tput -T linux colors, tput -T xterm colorsyaygın değerler göstermektedir -1(renk destek) ve 8(8 renk). Bunun sadece çıkış cihazını kontrol ettikten sonra geçerli olduğunu unutmayın (örneğin [ -t 1 ]veya isatty).
Mikel

tput colorsYerel terminal veritabanının terminal hakkında ne düşündüğünü döndürdüğünü unutmayın . Bu, özellikle xtermbirçok varyantta bulunan bir terminal tipi için (siyah ve beyazdan 256 renge kadar değişen) terminalin gerçekte neler yapabileceği ile aynı olabilir veya olmayabilir .
Gilles

7

Benim fikrim, programın yazdıramaması durumunda çıktıyı renklendirmemeyi bilmesi, yani, çıktıyı bir cron işinden bir dosyaya kaydetme, renkli çıktı kaydetmeye gerek kalmaması, ancak manuel olarak çalışırken görüntülemeyi seviyorum çıktı renkli.

Bu kullanım durumu için, tipik olarak programların yaptığı (örneğin GNU ya da GNU grep ile birlikte --color=auto) çıktısı bir terminale gidiyorsa ve aksi halde renk yoksa renk kullanmaktır. ANSI renk değiştiren dizileri desteklemeyen terminaller, kullanıcılarının varsayılan seçimi geçersiz kılması için kabul edilebilir derecede nadirdir. Her durumda, uygulamanızın renkleri açmaya veya kapatmaya yönelik bir seçeneği olduğundan emin olun.

Bir kabuk betiğinde, [ -t 1 ]standart çıktının bir terminal olup olmadığını test etmek için kullanın .

# 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

C API kullanan bir programdan arayın 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

Komutları daha az gibi çalıştırmak ve renkleri kullanarak çıktı veren bir programın çıktısına bakmak, çıktı yanlış

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

Kullanmayı deneyin less --RAW-CONTROL-CHARS.

Bu örnekte , çıktıları renkleri kullanarak basan logtool kullanıyorum.

- RAW-CONTROL-CHARS olmadan:

$ 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 ile (Bunun güzel renklerde olduğunu hayal edin. Ayrıca, bunun neden ^Ggörüntülendiğinden emin değilim .):

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

2

Bu, lessANSI kaçmalarını yorumlamaya ayarlanmamış olmanın suçudur ; aramaya Riçinde $LESSOPTS. Sistemin terminalinizin renklerle başa çıkabileceğini bilip bilmediğine karar vermek için, tput colorsdesteklediği renkleri ya -1da renkleri desteklemediğini belirtin. (Bazı terminallerin terminal açıklamaları xtermyerine kullanabileceğini xterm-color, ancak renkleri desteklediğini unutmayın.)


Benim fikrim, programın yazdıramaması durumunda çıktıyı renklendirmemeyi bilmesi, yani, çıktıyı bir cron işinden bir dosyaya kaydetme, renkli çıktı kaydetmeye gerek kalmaması, ancak manuel olarak çalışırken görüntülemeyi seviyorum çıktı renkli.
Angelo Vargas

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.