यदि आप कभी अपने लिनक्स शेल के तहत पाइप और रीडायरेक्शन का उपयोग करते हैं, तो संभावना है कि आपको कभी-कभी tee यूटिलिटी का उपयोग करने की भी आवश्यकता होगी।
tee क्या करता है?
lsजैसी कमांड आपके वर्तमान डायरेक्टरी की सामग्री प्रदर्शित करेगी। दूसरे शब्दों में, यह इन सामग्री को stdout (स्टैंडर्ड आउटपुट) पर प्रदर्शित करता है, जो आमतौर पर आपकी स्क्रीन होती है, या अधिक सटीक रूप से, आपका वर्चुअल टर्मिनल डिस्प्ले।
ls > file123जैसी कमांड आपकी स्क्रीन पर कुछ भी प्रदर्शित नहीं करेगी। ऐसा इसलिए है क्योंकि
> साइन सभी आउटपुट को स्क्रीन पर प्रदर्शित करने के बजाय एक फाइल में रीडायरेक्ट करता है। file123 अब उस सामग्री से भर जाएगी जो पहले आपकी स्क्रीन पर प्रदर्शित थी। अपनी डायरेक्टरी की सामग्री को स्क्रीन पर प्रदर्शित करने और इसे एक फाइल में लिखने के लिए, आप दो कमांड का उपयोग करते हैं। tee के साथ आप ये दोनों काम एक साथ कर सकते हैं।
ls | tee file123
यदि आप समान कमांड को दो बार चला सकते हैं तो Tee का उपयोग क्यों करें?
ऊपर दिए गए उदाहरण में, यदि आप ls को सामान्य रूप से निष्पादित कर सकते हैं और फिर इसे फिर से निष्पादित कर सकते हैं और आउटपुट को एक फाइल में रीडायरेक्ट कर सकते हैं तो आपको स्पष्ट रूप से tee की आवश्यकता नहीं है। हालांकि, आप ऐसी स्थितियों का सामना करेंगे जहां आउटपुट अद्वितीय होगा। एक परिदृश्य की कल्पना करें जहां आप किसी समस्या का निदान करने का प्रयास करते हैं। आप diagnose | tee error.log चलाते हैं। आपको जो एरर मिलते हैं वे अद्वितीय हो सकते हैं। आप उन्हें स्क्रीन पर प्रदर्शित होते देखना चाहते हैं ताकि आप देख सकें कि जैसे ही आप चीजों का परीक्षण करते हैं क्या हो रहा है। लेकिन आप उन एरर को एक फाइल में भी सेव करना चाहते हैं, ताकि आप बाद में उनकी समीक्षा कर सकें या किसी डिस्कशन फोरम पर आउटपुट पेस्ट करके लोगों से इसके बारे में पूछ सकें।
एक और स्थिति, जो अक्सर सामने आती है, जब आपको tee की आवश्यकता हो सकती है, वह यह है: आप किसी कमांड के आउटपुट को किसी ऐसे स्थान पर लिखना चाहते हैं जहां केवल रूट उपयोगकर्ता पढ़ या लिख सकता है। यह काम नहीं करेगा।
/sbin/blkid > /root/somefile
फिर, आप सोच सकते हैं, "ठीक है, बस sudo का उपयोग करें!" और आप आश्चर्यचकित होंगे कि यह भी काम नहीं करता:
sudo blkid > /root/somefile
ऐसा इसलिए है क्योंकि sudo blkid निष्पादित होने के बाद, आप अभी भी अपने नियमित, नॉन-रूट उपयोगकर्ता के रूप में लॉग इन हैं। और आपका शेल (आमतौर पर बैश), आपके नियमित उपयोगकर्ता क्रेडेंशियल्स के साथ /root/somefile पर लिखने का प्रयास करता है। इसे हल करने के लिए, आप tee का उपयोग कर सकते हैं:
/sbin/blkid | sudo tee /root/somefile
टेक्स्ट जोड़ना और एरर रीडायरेक्ट करना
tee एक उपयोगी लेकिन सरल कमांड है; एक बेसिक command | tee somefile ज्यादातर समय पर्याप्त होगा। हालांकि, दो परिदृश्य हैं जिनका आप सामना कर सकते हैं जिनके लिए इन युक्तियों की आवश्यकता होगी।
पहली बात यह जानना है कि tee, डिफ़ॉल्ट रूप से, हमेशा एक फाइल को ओवरराइट करता है। यदि आप चलाते हैं
ls | tee somefile
और फिर
ls /tmp | tee somefile
दूसरी कमांड somefile की सामग्री को ओवरराइट कर देगी, और आप केवल अंतिम निष्पादित कमांड की सामग्री देखेंगे। इस व्यवहार को बदलने के लिए, आप tee को ओवरराइट के बजाय टेक्स्ट जोड़ने के लिए बना सकते हैं। ऐसा करने के लिए, बस -a कमांड स्विच का उपयोग करें।
ls | tee -a somefile
दूसरी बात यह जानना है कि सभी आउटपुट समान नहीं हैं। एरर मैसेज को अलग तरह से माना जाता है, और हालांकि वे स्क्रीन पर दिखाई देते हैं, उन्हें stdout नहीं माना जाता है, इसलिए वे tee द्वारा नहीं पकड़े जाएंगे। (उन्हें stderr माना जाता है।) यहां grep पर एक उदाहरण है।
grep -r L2TP /etc | tee somefile
यह निम्न छवि जैसा कुछ प्रदर्शित करेगा।
Permission denied मैसेज stderr पर लिखे जाते हैं। stdout पर लिखी जाने वाली एकमात्र चीज हाइलाइट किया गया टेक्स्ट है। इसलिए आप देखेंगे कि "somefile" की सामग्री नीचे दी गई छवि में दिखाई गई है।
इस मामले में, जहां टेक्स्ट खोजने के लिए grep का उपयोग किया जाता है, यह उपयोगी है कि एरर मैसेज फाइल में रीडायरेक्ट नहीं होते। वे फाइल को अनावश्यक कचरे से भर देंगे। आप केवल पाए गए परिणाम देखना चाहते हैं। लेकिन जब आपको एरर मैसेज की आवश्यकता होती है, तो 2>&1 का उपयोग करें, जो stderr को stdout पर रीडायरेक्ट करता है।
grep -r L2TP /etc 2>&1 | tee somefile
इस कमांड के साथ आप देखेंगे कि somefile में अब एरर मैसेज भी हैं।
निष्कर्ष
उम्मीद है, यह ट्यूटोरियल tee कमांड का अधिकतम लाभ उठाने के लिए आपको जो कुछ भी चाहिए वह सब कुछ कवर करता है। लेकिन यदि आप ऐसी स्थिति का सामना करते हैं जहां आप tee के साथ फंस जाते हैं, तो नीचे कमेंट छोड़ें, और हम मदद करने में सक्षम हो सकते हैं।