मैं `कम` आउटपुट रंग कैसे बनाते हैं?


25

जब मैं (उदाहरण के लिए एक कार्यक्रम चलाने grepया ls) एक पेजर के बिना, इसके उत्पादन रंग का है। हालाँकि जब मैं इसे अपने आउटपुट को पाइप करता हूँ less, तो कोई रंग नहीं दिखाया जाता है।

उदाहरण के लिए, यह कमांड रंगीन आउटपुट को आउटपुट करता है:

grep -r something

लेकिन यह नहीं है:

grep -r something | less

क्यूं कर? मैं रंगों को कैसे देख सकता हूं less?


5
grep --color=always "search string" * | less -Rलेकिन मैं mostइसके बजाय आजकल का उपयोग करते हैं less। ALSO: gnu.org/software/src-highlite एक रंग हाइलाइटर है (कम काम भी करता है)
Rinzwind

@alex क्या आपने स्थापित किया है python-pygments?
souravc

@souravc नहीं मैंने स्थापित नहीं किया है कि
मोहम्मद रेजा रेजवानी

@ मुझे अनदेखा करने वाले हम हैं? >: - D
रिनविंड

जवाबों:


36

यहां पर दो समस्याएं हैं:

  • की तरह आदेश ls-which रंग समर्थन पाइप से समर्थन नहीं मिल रहा है स्वत: पता लगाएं
  • less डिफ़ॉल्ट रूप से रंग कोड प्रदर्शित करने के लिए सेट किया गया है।

दोनों को दूर किया जा सकता है लेकिन यह थोड़ा क्लिंक है:

ls --color=always | less -R

यह lsविशिष्ट नहीं है । रंग का समर्थन करने वाले कई आदेशों में एक ओवरराइड तर्क भी होता है।


थोड़ा और अधिक गहराई वाला उत्तर यह है कि lsजाँच हो रही है कि उसका STDOUT असली टर्मिनल से संबंधित है या नहीं। जब आप चीजों को चारों ओर से पाइप करते हैं, तो STDOUT अगले कमांड के STDIN पर सेट हो जाता है।

आप इसे स्रोत कोड मेंls काम पर देख सकते हैं । यह isattyकमांड (एक कोर POSIX इंटरफ़ेस) का उपयोग करके काम करता है कि स्थिति क्या है:

  • डिफ़ॉल्ट रूप से रंग हैं:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • क्या हम कई कॉलमों में आउटपुट देने की कोशिश करते हैं:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

grepएक बहुत ही समान काम करता है, जब तक कि स्पष्ट रूप से ओवरराइड नहीं किया जाता है, यह रंग समर्थन का पता लगाएगा, साथ में isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();

1
100k के लिए समर्थन करने के लिए आज के लिए मेरा अंतिम उत्थान (सीमा तक पहुंच गया)। लेकिन मैं और रिनविंड केक चाहते हैं जब ऐसा होता है।
hytromo

मैंने एक प्रोग्राम डाउनलोड किया था जिसका नाम ack-grep था। जब प्रकार ack-grep foo, यह सभी उप निर्देशिकाओं पर foo खोजेगा। तो मैंने ack-grep foo किया | कम, और रंग चले गए। लेकिन लगता है कि यह कार्यक्रम "--color = always" का समर्थन नहीं करता है, जो भी मदद के लिए धन्यवाद
मोहम्मद रजा रेजवानी

1
@alex पावती एक है --color: तर्कack-grep -i select --color | less -R
ओली

@ ओली ......... ओह माय गॉड ........ केवल एक चीज जो मैं आपके ज्ञान और मदद के बारे में कह सकता हूं और यह भी कि लिनक्स की शक्ति
मोहम्मद रजा रेजवानी

1
@ B1KMusic मैं सहमत हूं। मैं इतना सहमत हूं कि मैंने पाया कि यह कैसे काम करता है और उत्तर को अद्यतन करता है। आप एक -Cतर्क के साथ कॉलम को बाध्य कर सकते हैं ।
ओली

2

यदि आप lessआमतौर पर रंगों में रुचि रखते हैं , तो आप देखना चाह सकते हैं lesspipe.sh। उदाहरण के लिए देखें, http://freecode.com/projects/lesspipe

lesspipe.sh पेजर के लिए एक इनपुट फ़िल्टर है जैसा कि कम मैन पेज में वर्णित है। स्क्रिप्ट एक ksh- संगत शेल (उदाहरण के लिए bash, zsh) के तहत चलती है और आपको द्विआधारी सामग्री, संपीड़ित फ़ाइलें, अभिलेखागार और अभिलेखागार में मौजूद फ़ाइलों के साथ फ़ाइलों को देखने के लिए कम उपयोग करने की अनुमति देता है।

यह एक पाठ संपादक के समान शेल स्क्रिप्ट, पर्ल स्क्रिप्ट आदि को भी रंग देगा, लेकिन रंगाई करने के लिए किसी भी "प्रीप्रोसेसिंग" प्रोग्राम के उपयोग के बिना।

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