क्या कुछ पर्यावरण चर है?
हाँ। यह TERM
पर्यावरण चर है। ऐसा इसलिए है क्योंकि कई चीजें हैं जो निर्णय प्रक्रिया के हिस्से के रूप में उपयोग की जाती हैं।
यहां सामान्यीकरण करना मुश्किल है, क्योंकि सभी कार्यक्रम एक ही निर्णय प्रवाह पर सहमत नहीं हैं। वास्तव में grep
, GNU , जिसका उल्लेख एम। किट के उत्तर में किया गया है, बाहरी रूप से एक अच्छा उदाहरण है जो अप्रत्याशित परिणामों के साथ कुछ असामान्य निर्णय प्रक्रिया का उपयोग करता है। बहुत सामान्य शब्दों में, इसलिए:
- मानक आउटपुट टर्मिनल डिवाइस होना चाहिए, जैसा कि निर्धारित किया गया है
isatty()
।
- कार्यक्रम टर्मपैक / टर्मोफ डेटाबेस में टर्मिनल प्रकार के लिए रिकॉर्ड देखने में सक्षम होना चाहिए।
- इसलिए ऊपर देखने के लिए एक टर्मिनल प्रकार होना चाहिए ।
TERM
वातावरण चर मौजूद होना चाहिए और अपने मूल्य एक डेटाबेस रिकॉर्ड से मेल खाना चाहिए।
- इसलिए एक टर्मोफ़ / टर्मकैप डेटाबेस होना चाहिए। सबसिस्टम के कुछ कार्यान्वयन पर,
TERMCAP
पर्यावरण चर का उपयोग करके टर्मपैक डेटाबेस का स्थान निर्दिष्ट किया जा सकता है । तो कुछ कार्यान्वयन पर एक दूसरा वातावरण चर है।
- टर्मकैप / टर्मऑफ़ रिकॉर्ड को यह बताना होगा कि टर्मिनल प्रकार रंगों का समर्थन करता है।
max_colors
Termfo में एक क्षेत्र है। यह उन टर्मिनल प्रकारों के लिए सेट नहीं है जिनमें वास्तव में रंग क्षमताएं नहीं हैं। वास्तव में, एक टर्मोफ कन्वेंशन है कि हर कोलॉइरेबल टर्मिनल प्रकार के लिए एक और रिकॉर्ड है -m
या -mono
नाम के साथ जोड़ा गया है जिसमें कोई रंग क्षमता नहीं है।
- रंग बदलने के लिए प्रोग्राम के लिए रास्ता प्रदान करना चाहिए। Termfo में फ़ील्ड्स
set_a_foreground
और set_a_background
फ़ील्ड्स हैं ।
यह सिर्फ जाँच से थोड़ा अधिक जटिल है isatty()
। इसे कई चीजों से और जटिल बनाया गया है:
- कुछ एप्लिकेशन कमांड-लाइन विकल्प या कॉन्फ़िगरेशन फ़्लैग जोड़ते हैं जो
isatty()
चेक को ओवरराइड करते हैं , ताकि प्रोग्राम हमेशा या कभी भी यह न मानें कि इसके आउटपुट के रूप में इसका (colourable) टर्मिनल है। उदाहरण के लिए:
- GNU
ls
में --color
कमांड-लाइन विकल्प है।
- बीएसडी (इसकी अनुपस्थिति अर्थ कभी नहीं ) और (इसकी उपस्थिति का अर्थ हमेशा ) पर्यावरण चर को
ls
देखता है , और कमांड-लाइन विकल्प को भी स्पोर्ट करता है।CLICOLOR
CLICOLOR_FORCE
-G
- कुछ एप्लिकेशन टर्मकैप / टर्मफो का उपयोग नहीं करते हैं और मूल्य के लिए कठोर प्रतिक्रियाएं हैं
TERM
।
- सभी टर्मिनल ईसीएमए -48 या आईएसओ 8613-6 एसजीआर अनुक्रमों का उपयोग नहीं करते हैं, जो कि रंग बदलने के लिए थोड़ा गलत नाम "एएनएसआई एस्केप अनुक्रम" हैं। Termcap / termfo तंत्र वास्तव में सटीक नियंत्रण अनुक्रमों के प्रत्यक्ष ज्ञान से अनुप्रयोगों को इन्सुलेट करने के लिए डिज़ाइन किया गया है। (इसके अलावा, एक तर्क दिया जा रहा है कि कोई भी ISO 8613-6 SGR दृश्यों का उपयोग नहीं करता है, क्योंकि हर कोई RGB रंग SGR अनुक्रमों के लिए सीमांकक के रूप में अर्ध-बृहदान्त्र का उपयोग करने की बग पर सहमत है । मानक वास्तव में बृहदान्त्र को निर्दिष्ट करता है।
जैसा कि उल्लेख किया गया है, जीएनयू grep
वास्तव में इनमें से कुछ अतिरिक्त जटिलताओं का प्रदर्शन करता है। यह टर्मकैप / टर्मऑफ़ से परामर्श नहीं करता है, नियंत्रण अनुक्रमों को उत्सर्जन करने के लिए हार्डवियर्स करता है, और TERM
पर्यावरण चर के लिए एक प्रतिक्रिया देता है ।
इसके लिनक्स / यूनिक्स पोर्ट में यह कोड होता है , जो केवल कोलोरिज़ेशन को सक्षम करता है जब TERM
पर्यावरण चर मौजूद होता है और इसका मान हार्डवार्ड नाम से मेल नहीं खाता है dumb
:
पूर्णांक
should_colorize (शून्य)
{
char const * t = getenv ("TERM");
वापसी t && strcmp (टी, "गूंगा")! = 0;
}
यहां तक कि अगर आपका TERM
है xterm-mono
, तो जीएनयू grep
रंगों का उत्सर्जन करने का फैसला करेगा, भले ही अन्य कार्यक्रम जैसे कि vim
नहीं होगा।
इसके Win32 पोर्ट में यह कोड है , जो कि कोलोरिज़ेशन को सक्षम करता है जब TERM
पर्यावरण चर मौजूद नहीं होता है या जब यह मौजूद होता है और इसका मान हार्डवेयर्ड नाम से मेल नहीं खाता है dumb
:
पूर्णांक
should_colorize (शून्य)
{
char const * t = getenv ("TERM");
वापसी ! (t && strcmp (t, "dumb") == 0);
}
grep
रंग के साथ GNU की समस्याएं
ग्नू grep
का कोलोरिज़ेशन वास्तव में कुख्यात है। क्योंकि यह वास्तव में टर्मिनल आउटपुट के निर्माण का एक उचित काम नहीं करता है, बल्कि व्यर्थ की उम्मीद में इसके आउटपुट में विभिन्न बिंदुओं पर कुछ कठोर नियंत्रण अनुक्रमों में सिर्फ दोष देता है जो कि काफी अच्छा है, यह वास्तव में कुछ परिस्थितियों में गलत आउटपुट प्रदर्शित करता है।
ये हालात ऐसे हैं, जहां उसे कुछ ऐसा करना पड़ता है, जो टर्मिनल के दाहिने हाथ से होता है। प्रोग्राम जो टर्मिनल आउटपुट को ठीक से करते हैं, उन्हें स्वचालित सही मार्जिन के लिए जिम्मेदार होना चाहिए। मामूली संभावना के अलावा कि टर्मिनल उनके पास नहीं हो सकता है ( auto_right_margin
टर्मिन में फ़ील्ड), टर्मिनलों का व्यवहार जो स्वचालित रूप से सही हाशिये का है, वे अक्सर लंबित लाइन रैप के DEC VT मिसाल का पालन करते हैं । GNU grep
इसके लिए जिम्मेदार नहीं है, भोलेपन से तत्काल लाइन रैप की उम्मीद करते हैं , और इसका रंगीन आउटपुट गलत हो जाता है।
रंगीन आउटपुट एक साधारण चीज नहीं है।
आगे की पढाई