इस तरह से STDERR को / dev / null में पुनर्निर्देशित क्यों किया जाता है?


29

इससे मुझे कोई मतलब नहीं है।

wibble > /dev/null 2>&1

मुझे लगता है कि यह अधिक समझ में आता है अगर यह कुछ इस तरह था:

wibble 2>&1 > /dev/null

दूसरे शब्दों में

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

कमांड पुनर्निर्देशन के आदेश के पीछे की सोच क्या है xxx > /dev/null 2>1?


6
आपको यह स्पष्टीकरण उपयोगी भी लग सकता है।
rozcietrzewiacz

धन्यवाद @rozcietzewiacz कि वास्तव में मेरे सवाल का सटीक वर्णन करता है
whoami 16

1
ग्रेग के विकी पर उस पृष्ठ के मध्य में एक उत्कृष्ट मार्ग है : "यदि आप अभी भी इस बिंदु पर भ्रमित हैं, तो यह संभवत: इसलिए है क्योंकि आपने एफडी काम करने के बारे में गलत धारणा के साथ शुरुआत की थी, और आप उस गलत धारणा को छोड़ने में सक्षम नहीं हैं। अभी तक। चिंता न करें - यह एक बहुत ही आम गलत धारणा है, और आप अकेले नहीं हैं। ... बहुत से लोग सोचते हैं कि 2>&1किसी तरह "एकजुट" या "एक साथ संबंध" या "एफडी" से दो एफडी करते हैं, ताकि उनमें से किसी एक में बाद में परिवर्तन दूसरे में परिवर्तन हो जाए। मामला यह नहीं है "।
जी-मैन कहते हैं 'को फिर से बहाल मोनिका'

जवाबों:


41

रीडायरेक्ट को बाएं से दाएं संसाधित किया जाता है। यदि तुम करो

2>&1 1> /dev/null

पहला रीडायरेक्ट stderrउस धारा की ओर संकेत करता है stdoutजो उस समय (जो अनिवार्य रूप से आपका ट्टी है) इंगित करता है । यह stderrएक उपनाम नहीं बनाता है stdout

फिर stdoutबिट बाल्टी में पुनर्निर्देशित किया जाता है। stdoutरीडायरेक्ट पिछले प्रभावित नहीं करता stderrरीडायरेक्ट। stderrअभी भी अपने tty को संदर्भित करता है।

इसलिए:

ls file_that_doesnt_exist 2>&1 1> /dev/null

आपके टर्मिनल पर केवल त्रुटि संदेश प्रिंट करेगा।

bashपुनर्निर्देशन प्रलेखन पेज इस खासतौर पर इसका उल्लेख:

ध्यान दें कि पुनर्निर्देशन का क्रम महत्वपूर्ण है। उदाहरण के लिए, कमांड

          ls > dirlist 2>&1

कमांड के दौरान मानक और आउटपुट दोनों को फाइल डर्लिस्ट को निर्देश देता है

          ls 2>&1 > dirlist

केवल मानक आउटपुट को dirlist फाइल करने के लिए निर्देशित करता है, क्योंकि मानक आउटपुट को dirlist पर पुनर्निर्देशित करने से पहले मानक आउटपुट से डुप्लिकेट किया गया था


3
याय ने मेरे कोनड्रोम को हल किया। मैं अभी भी तार्किक रूप से इसके भ्रमित होने के बारे में सोचता हूं। लेकिन मुझे उसी पृष्ठ पर एक और हिस्सा मिला जो दिलचस्प &>/dev/nullहै, शब्दार्थ के बराबर है/dev/null 2>&1
whoami

1
इस बात पर जोर दिया जाना चाहिए कि आप जिस पृष्ठ के बारे में बात कर रहे हैं वह बैश संदर्भ नियमावली का हिस्सा है । यह, जाहिर है, बैश का वर्णन करता है । दुनिया में अन्य गोले, बैश से अलग हैं, और &>और >&(जब संदर्भ में इस्तेमाल नहीं किया 2>&1या >&2, आदि) बैश-वाद कर रहे हैं और नहीं कर रहे हैं मानक । उन्हें शेल स्क्रिप्ट में उपयोग नहीं किया जाना चाहिए जो आप पोर्टेबल होना चाहते हैं।
जी-मैन का कहना है कि 'मोनिका'
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.