कैसे चेक करें कि क्या बैश रंगों को प्रिंट कर सकता है


62

मैं यह जानना चाहता हूं कि क्या कोई ऐसा तरीका है जो यह जांच सकता है कि मेरा प्रोग्राम रंगों का उपयोग करके टर्मिनल आउटपुट का उत्पादन कर सकता है या नहीं।

कमांड को चलाना lessऔर ऐसे प्रोग्राम से आउटपुट को देखना जो रंगों का उपयोग करके आउटपुट करता है, आउटपुट गलत प्रदर्शित होता है, जैसे

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

धन्यवाद



जवाबों:


68

कार्यक्रम को प्रिंट नहीं करने के लिए आउटपुट को रंगने के लिए नहीं जानने के लिए मेरे आवेदन के लिए विचार यह है कि प्रोग्राम प्रिंट नहीं कर सकता है, कह सकते हैं कि एक क्रॉन जॉब से फाइल में आउटपुट लॉगिंग, रंगीन आउटपुट लॉग करने की कोई आवश्यकता नहीं है, लेकिन जब मैन्युअल रूप से चल रहा है, तो मुझे देखना पसंद है आउटपुट रंगीन

आप किस भाषा में अपना आवेदन लिख रहे हैं?

सामान्य दृष्टिकोण यह जांचने के लिए है कि आउटपुट डिवाइस एक छोटा है, और यदि यह है, तो जांचें कि क्या उस प्रकार का टर्मिनल रंगों का समर्थन करता है।

में 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.

सी में, आपको बहुत अधिक टाइपिंग करनी होगी, लेकिन आईट्टी और सूचीबद्ध सूचीबद्ध कार्यों का उपयोग करके समान परिणाम प्राप्त कर सकते हैं man 3 terminfo


^ ^ कि ^ ^ बिल्कुल वही था जो मैं देख रहा था। धन्यवाद।
टिम कैनेडी

टिंट के बारे में संकेत के लिए धन्यवाद। यह एक बहुत अच्छा जवाब है।
आमादुसड्रज़ाईस

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.

Termcap colorsterminfo डेटाबेस में है, इसलिए आप इसके लिए पूछ सकते हैं। यदि आपके पास शून्य निकास की स्थिति है, तो टर्मकैप को संकलित किया जाता है, लेकिन यदि आपके पास किसी तरह का है:

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

इससे पता चलता है कि अपरिचित अस्तित्व में नहीं है। तो यह:

$ tput colors
8
$ echo $?
0

दिखाता है कि आपकी आज्ञा सही थी।

अन्य उपयोगी तरीके:

  • C में, आप सिर्फ isatty का उपयोग कर सकते हैं और देख सकते हैं कि क्या यह TTY है
  • देखें कि क्या यह एक डंब टर्मिनल है जो $ TERM वैरिएबल है

चियर्स


colorstputमैन पेज (?) में प्रलेखित नहीं है , तो क्या मुझे stdout में संख्या in = the या ० का रिटर्न कोड देखना चाहिए?
l0b0

जाहिर है, लेकिन आपकी टिप्पणी से पता चलता है कि यह नहीं है। मैं उस जानकारी को जोड़ रहा हूं (संक्षेप में, रंग टर्मो डेटाबेस की एक क्षमता है)
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

यह विचार मेरे आवेदन के लिए है कि आउटपुट को कलर नहीं किया जाए, अगर प्रोग्राम प्रिंट नहीं कर सकता है, तो कह सकते हैं कि क्रॉन जॉब से फाइल में आउटपुट लॉग करना, रंगीन आउटपुट लॉग करने की आवश्यकता नहीं है, लेकिन मैन्युअल रूप से चलने पर, मुझे देखना पसंद है आउटपुट रंगीन।

इस उपयोग के मामले के लिए, आमतौर पर कौन से प्रोग्राम करते हैं (जैसे GNU ls या GNU grep --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

C API का उपयोग करके एक प्रोग्राम से, कॉल करें 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

इस उदाहरण में मैं लॉगटूल का उपयोग कर रहा हूं , जो रंगों का उपयोग करके आउटपुट प्रिंट करता है।

बिना --RAWOW- नियंत्रण के नियम:

$ 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

के साथ --RAWRO-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एएनएसआई से बचने के लिए निर्धारित नहीं होने का दोष होगा ; देखने Rमें $LESSOPTS। यह निर्धारित करने के लिए कि क्या सिस्टम जानता है कि आपका टर्मिनल रंगों से निपट सकता है, tput colorsया तो रंगों की संख्या का समर्थन करता है या -1यदि वह रंगों का समर्थन नहीं करता है। (ध्यान दें कि कुछ टर्मिनल अपने टर्मिनल विवरण के xtermबजाय उपयोग कर सकते हैं xterm-color, लेकिन फिर भी रंगों का समर्थन करते हैं।)


यह विचार मेरे आवेदन के लिए है कि आउटपुट को कलर नहीं किया जाए, अगर प्रोग्राम प्रिंट नहीं कर सकता है, तो कह सकते हैं कि क्रॉन जॉब से फाइल में आउटपुट लॉग करना, रंगीन आउटपुट लॉग करने की आवश्यकता नहीं है, लेकिन मैन्युअल रूप से चलने पर, मुझे देखना पसंद है आउटपुट रंगीन।
एंजेलो वर्गास

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.