/ dev / stderr बनाम> और 2 को आउटपुट भेजना


11

स्क्रिप्ट में, त्रुटियों को आमतौर पर 2 डिस्क्रिप्टर के साथ फाइल करने के लिए भेजा जाता है &2, अर्थात:

echo "error" >&2

/dev/stderrइसके बजाय कभी-कभी उपयोग किया जाता है:

echo "error" > /dev/stderr 

देखते हुए /dev/stderr, मैं देखता हूं कि यह केवल एक सिम्लिंक है /proc/self/fd/2, जो बदले में /dev/pts/5(मेरे वर्तमान टर्मिनल पर) एक सिमलिंक है ।

थोड़ा जटिल लगता है। क्या इसके पीछे कुछ तर्क है?

उपयोग कर रहा है /dev/stderrऔर &2समकक्ष है?

क्या उनमें से किसी को दूसरे पर पसंद किया जाता है?


3
echo "error" >2नाम 2और सामग्री के साथ एक फ़ाइल बनाता है error
सायरस


मैं अपने संपादन को 2 के बजाय reintroduced & 2 देखता हूं। क्या आपका प्रश्न वास्तव में उपयोग के बारे में है >2, या >&2?
जेफ स्कालर

जवाबों:


13

विशेष डिवाइस /dev/stderrसिस्टम-विशिष्ट है, जबकि फ़ाइल डिस्क्रिप्टर 2(विशेष डिवाइस नहीं /proc/self/fd/2) पोर्टेबल है। यदि आप गैर-पोर्टेबल कोड लिखना चाहते हैं, तो उन विशेष उपकरणों को शुरू करने के लिए एक अच्छी जगह है।

कुछ सिस्टम हैं /dev/stderr: लिनक्स, बिल्कुल, और OSX । लेकिन OSX का कोई /procफाइल सिस्टम नहीं है , और इसकी /dev/stderrएक कड़ी है /dev/fd/2

आगे की पढाई:


इसके अलावा ऐसा मामला है जहां कोई उदाहरण के लिए करना चाहता है। यह 2> bla.logतब तक काम करेगा जब तक आप 2हार्ड-कोड को पाइप न करें /dev/stderr। मूल रूप से आउटपुट होने की आवश्यकता2 नहीं हैstderr
larkey

6

बैश, और अन्य गोले में, मानक त्रुटि के लिए कुछ को पुनर्निर्देशित करने का तरीका उपयोग करना है >&2। बैश फाइल डिस्क्रिप्टर के/dev/stderr रूप में खुलता है । फ़ाइल डिस्क्रिप्टर को डिस्क्रिप्टर की संख्या कहाँ से संदर्भित किया जाता है। तो, मानक त्रुटि के लिए , को मुद्रित करेगा । 2&NNecho error >&2error/dev/stderr

यह /dev/stdoutफ़ाइल डिस्क्रिप्टर के रूप में भी खुलेगा 1। इसका मतलब है आप कर सकते हैं echo output >&1। हालांकि, चूंकि सब कुछ डिफ़ॉल्ट रूप से वैसे भी मानक आउटपुट पर मुद्रित होता है, जो कि echo outputस्वयं के समान है।

अब, 2>अलग है। यहां, आप कमांड के एरर आउटपुट को कहीं और रीडायरेक्ट कर रहे हैं। तो, का 2>fileअर्थ है "वर्णनात्मक 2 (मानक त्रुटि) को फ़ाइल करने के लिए मुद्रित कुछ भी पुनर्निर्देशित file"।


3

आप सही हैं, >&2अधिक प्रत्यक्ष और पूरी तरह से "मुहावरेदार" हैं। वे समकक्ष होना चाहिए, इसलिए उपयोग करने का कोई विशेष कारण नहीं है >/dev/stderr। सिवाय इसके कि, अगर कोई पढ़ने वाला यह नहीं जानता कि ये क्या करते हैं, तो उनमें से एक को शायद दूसरे :-) की तुलना में पता लगाना आसान है। लेकिन सामान्य तौर पर मैं आपको उपयोग करने का सुझाव दूंगा >&2

/ dev / stderr उपयोगी हो सकता है जब प्रोग्राम एक निर्दिष्ट फ़ाइल नाम में त्रुटियाँ लिखेंगे, लेकिन stderr का समर्थन नहीं करते। स्पष्ट रूप से यह थोड़ा विवादित है; / dev / stdout अधिक उपयोगी है। (मैं हाल ही में पाया गया कि mysql_safeरैपर स्क्रिप्ट कंसोल में त्रुटियों को नहीं लिखेगा; दुर्भाग्य से यह त्रुटि लॉग फ़ाइल पर अनुमतियों को बदलना भी चाहता है, इसलिए / dev / stderr का उपयोग करने से कुछ शानदार चेतावनी मिलती है)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.