Grep स्विच --color = ऑटो क्या करता है?


8

Grep में स्विच के autoविकल्प के रूप में क्या प्रभाव पड़ता है --color? Grep मैचिंग स्ट्रिंग्स को कलर करने का निर्णय कब करता है, और कब नहीं?

जवाबों:


12

अपेक्षित् व्यवहार

के साथ --color=auto, grep मिलान स्ट्रिंग्स को उजागर करेगा यदि (और केवल अगर) आउटपुट सीधे टर्मिनल को लिखा जाता है और कहा टर्मिनल रंगीन आउटपुट प्रदर्शित करने में सक्षम है।

आम तौर पर, --color=autoआप क्या चाहते हैं। यदि, उदाहरण के लिए, आप एक URL से मिलान करने के लिए grep का उपयोग करते हैं और इसे Wget पर पाइप करते हैं, तो Wget \e[1;31mhttp://...वास्तविक URL के बजाय (और उस पर चोक) देखेंगे ।

निम्न आदेशों का परिणाम रंगीन आउटपुट में होना चाहिए:

echo Super User | grep --color=auto Super
echo Super User | grep --color=always Super | cat

हालाँकि, यह आदेश नहीं होना चाहिए:

echo Super User | grep --color=auto Super | cat

इस व्यवहार के साथ किसी भी असंगतता को बग माना जाना चाहिए।

सोर्स कोड

विंडोज संस्करण (2.5.4) के लिए--color=auto नवीनतम ग्रेप के साथ - साथ ही मूल 2.5.4 पर यह आधारित है - अगर उत्पादन और केवल अगर हालत

isatty(STDOUT_FILENO) && getenv("TERM") && strcmp(getenv("TERM"), "dumb")

यह सच है, अर्थात, यदि और केवल अगर आउटपुट एक टर्मिनल को लिखा जा रहा है, तो पर्यावरण चरTERM को परिभाषित किया गया है और टर्मिनल गूंगा नहीं है

यह विंडोज के तहत वांछित व्यवहार का उत्पादन नहीं करेगा, क्योंकि TERMआम तौर पर परिभाषित नहीं किया जाता है। इस समस्या का एक आसान समाधान TERM=windowsनियंत्रण कक्ष में स्थापित है ।

Grep का नवीनतम संस्करण (2.14) आउटपुट को कलर करके इस समस्या को ठीक करता है यदि और केवल यदि स्थिति

isatty(STDOUT_FILENO) && should_colorize()

सच है, जहां should_colorize()पोसिक्स और Win32 के लिए अलग-अलग परिभाषित किया गया है:

पूर्व के लिए, स्थिति 2.5.4 में से एक के बराबर है; उत्तरार्द्ध के लिए, एनवायरमेंट वेरिएबल TERMको सेट करने की आवश्यकता नहीं है (यह सिर्फ नहीं हो सकता है dumb)।


यह कैसे पता चलता है कि यह टर्मिनल को लिखता है या नहीं?
ट्रोलज़ेन

1
उस के लिए एक सी फ़ंक्शन है। यदि आप शीर्ष लेख फ़ाइल को शामिल करते हैं sdgstd.h, तो यदि आउटपुट किसी फ़ाइल में पुनर्निर्देशित होता है , तो istty(stdout)रिटर्न 0
डेनिस

की खिड़कियों पोर्ट के साथ मैं प्रयोग grepऔर lessग्नूविन परियोजना से (gnuwin32.sourceforge.net)। उपयोगिता के cmd.exeसाथ सुधार हुआ है ansiconless --color=autoउम्मीद के मुताबिक काम करता है: जब कोई रीडायरेक्शन लागू नहीं होता है और आउटपुट पुनर्निर्देशित नहीं होता है तो रंग का उपयोग करता है। लेकिन grep --color=autoदोनों मामलों में एस्केप सीक्वेंस नहीं छापते।
ट्रोलज़ेन

मैं समझ नहीं पा रहा हूं कि ऐसा क्यों होता है। मुझे लगा कि इन उपयोगिताओं का यूनिक्स और विंडोज़ दोनों संस्करणों में समान कोड है और वे काफी पुरानी हैं। इसलिए उन्हें पहचान के साथ व्यवहार करना चाहिए।
ट्रोलज़ेन

GnuWin32 के grep में यह एक बग है। उबंटू पर, यह व्यवहार करता है जैसा कि मैंने अपने जवाब में विस्तृत किया है। हालांकि दोनों एक ही स्रोत कोड से प्राप्त होते हैं, हमेशा ऐसे छोटे समायोजन होते हैं जिन्हें यदि आप किसी अन्य प्लेटफ़ॉर्म पर संकलित करने जा रहे हैं तो करना पड़ता है। इसके अलावा, ध्यान रखें कि GnuWin32 grep का वर्तमान संस्करण 2.5.4 है। Ubuntu पर नवीनतम संस्करण 2.12 है।
डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.