यदि आप वास्तव में "रीडायरेक्ट" और "पाइप" के साथ क्या हो रहा है, इसके बारे में सोचते हैं तो चीजों को कल्पना करना बहुत आसान है। बैश में रीडायरेक्ट और पाइप एक काम करते हैं: जहां प्रक्रिया फ़ाइल विवरणकों को 0, 1, और 2 को संशोधित करती है (देखें / proc / [pid] / fd / *)।
जब एक पाइप या "|" ऑपरेटर कमांड लाइन पर मौजूद होता है, पहली बात यह है कि बैश एक फेनो बनाता है और लेफ्ट साइड कमांड की एफडी 1 को इस फि ल्म में इंगित करता है, और राइट साइड कमांड की एफडी 0 को उसी फि ल्म को इंगित करता है।
इसके बाद, प्रत्येक पक्ष के लिए पुनर्निर्देशित ऑपरेटरों का मूल्यांकन बाईं से दाईं ओर किया जाता है , और वर्तमान सेटिंग्स का उपयोग तब किया जाता है जब भी विवरणकर्ता का दोहराव होता है। यह महत्वपूर्ण है क्योंकि चूंकि पाइप को पहले स्थापित किया गया था, इसलिए FD1 (बाईं ओर) और FD0 (दाईं ओर) पहले से ही बदल दिए गए हैं जो कि वे सामान्य रूप से हो सकते हैं, और इनमें से कोई भी दोहराव उस तथ्य को प्रतिबिंबित करेगा।
इसलिए, जब आप निम्नलिखित जैसा कुछ लिखते हैं:
command 2>&1 >/dev/null | grep 'something'
यहाँ क्या होता है, क्रम में:
- एक पाइप (फीफो) बनाया जाता है। "कमांड FD1" इस पाइप को इंगित किया गया है। "grep FD0" भी इस पाइप को इंगित करता है
- "कमांड FD2" को इंगित किया जाता है, जहां "कमांड FD1" वर्तमान में इंगित करता है (पाइप)
- "कमांड FD1" को / dev / null को इंगित किया गया है
इसलिए, सभी आउटपुट जो "कमांड" अपने FD 2 (stderr) को लिखते हैं, पाइप के लिए अपना रास्ता बनाता है और दूसरी तरफ "grep" द्वारा पढ़ा जाता है। सभी आउटपुट जो "कमांड" अपने FD 1 (stdout) को लिखते हैं, वह / dev / null के लिए अपना रास्ता बनाता है।
यदि इसके बजाय, आप निम्न कार्य करते हैं:
command >/dev/null 2>&1 | grep 'something'
यहाँ क्या होता है:
- एक पाइप बनाया गया है और "कमांड एफडी 1" और "जीआरपी एफडी 0" को इंगित किया गया है
- "कमांड FD 1" को / dev / null को इंगित किया गया है
- "कमांड एफडी 2" को इंगित किया जाता है, जहां एफडी 1 वर्तमान में इंगित करता है (/ देव / शून्य)
तो, सभी कमांडआउट और "कमांड" से stderr / dev / null पर जाते हैं। पाइप में कुछ भी नहीं जाता है, और इस तरह "grep" स्क्रीन पर कुछ भी प्रदर्शित किए बिना बंद हो जाएगा।
यह भी ध्यान दें कि रीडायरेक्ट (फ़ाइल डिस्क्रिप्टर) केवल-पढ़ने के लिए (<), राइट-ओनली (>), या रीड-राइट (<>) हो सकते हैं।
एक अंतिम नोट। चाहे कोई प्रोग्राम FD1 या FD2 में कुछ लिखता है, पूरी तरह से प्रोग्रामर पर निर्भर है। अच्छा प्रोग्रामिंग अभ्यास यह निर्धारित करता है कि त्रुटि संदेश एफडी 2 और सामान्य आउटपुट एफडी 1 पर जाना चाहिए, लेकिन आप अक्सर मैला प्रोग्रामिंग पाएंगे जो दोनों को मिलाते हैं या अन्यथा सम्मेलन की उपेक्षा करते हैं।