शेल स्क्रिप्ट्स में stderr पर पुनर्निर्देशन का उपयोग कब करें


15

मुझे पता है कि अच्छी तरह से उपयोग किए जाने वाले उपयोगिताओं जैसे कि grep आउटपुट "सामान्य" संदेश stdout को, और त्रुटि संदेश stderr को।

$ grep '^foo' file1 file2
file1:foo
grep: file2: No such file or directory

जब मैं स्वयं शेल स्क्रिप्ट लिख रहा होता हूं, तो मुझे अक्सर यह तय करना मुश्किल होता है कि मुझे किस आउटपुट और कौन से संदेशों को stderr पर प्रस्तुत करना चाहिए, या यदि मुझे इन सब से परेशान होना चाहिए।

मैं अच्छे अभ्यास के बारे में जानना चाहता हूं: जब किसी संदेश को स्ट्रेडर पर पुनर्निर्देशित किया जाता है, तो वह उचित और उचित नहीं होता है, और कब नहीं?

"यह निर्भर करता है", निश्चित रूप से, लेकिन क्या आपके पास कुछ अंतर्दृष्टि हैं जो मुझे ये निर्णय लेने में मदद करेंगे?

इस व्यक्तिपरक प्रश्न को प्रारूप में फिट करने के लिए, मैं "क्यों" को संबोधित करने वाले उत्तरों को प्रोत्साहित करना चाहूंगा, और अनुभव द्वारा सूचित किया जा सकता है और यदि संभव हो तो तथ्यों द्वारा समर्थित है।


@rush इसे पूरी तरह से समझाते हैं। मैं आमतौर पर लंबे स्क्रिप्ट के लिए प्रगति रिपोर्ट प्रिंट करता हूं।
terdon

जवाबों:


12

जब मैं स्वयं शेल स्क्रिप्ट लिख रहा होता हूं, तो मुझे अक्सर यह तय करना मुश्किल होता है कि मुझे किस आउटपुट और कौन से संदेशों को stderr पर प्रस्तुत करना चाहिए, या यदि मुझे इन सब से परेशान होना चाहिए।

खामोशी स्वर्णिम है। सब कुछ ठीक है तो कुछ भी नहीं।

मैं अच्छे अभ्यास के बारे में जानना चाहता हूं: जब किसी संदेश को स्ट्रेडर पर पुनर्निर्देशित किया जाता है, तो वह उचित और उचित नहीं होता है, और कब नहीं?

स्टडआउट से स्टॉडर को अलग करने का सबसे आसान तरीका: बस कल्पना करें कि आपके सभी स्क्रिप्ट आउटपुट को पाइप के माध्यम से किसी अन्य कमांड पर रीडायरेक्ट किया जाएगा। उस स्थिति में आपको stderr में सभी सूचनाएं रखनी चाहिए, क्योंकि stdout में ऐसी अप्रत्याशित जानकारी पाइप अनुक्रम को तोड़ सकती है।

कभी-कभी इस तरह के पाइप में भी:

command1 | while read line ; do command2 ; done | command3

आपको command2उपयोगकर्ता आउटपुट से कुछ पास करने की आवश्यकता है । अस्थायी फ़ाइलों के बिना सबसे आसान तरीका stderr है।


"एक पाइप की कल्पना करें" विचार के लिए धन्यवाद। कभी-कभी मैंने उन लिपियों को तैनात किया है जो "नोटिफ़िकेशन" ( echoकुछ चर) नहीं दिखाते हैं (जो कुछ किया गया है, प्रगति दिखाएं)। मैं सब कुछ stderr पर डाल करने के लिए संकोच के बाद से इन लॉगिंग संदेश सभी स्क्रिप्ट कभी उत्पादन कर रहे हैं। मुझे यकीन नहीं है कि इन स्थितियों में पाइप के विचार को कैसे लागू किया जाए।
glts

1
@glts कार्यक्रम हमेशा संशोधित और बेहतर हो रहे हैं। हालांकि जिन लिपियों का आप उल्लेख करते हैं, वे अब किसी डेटा का उत्पादन नहीं करती हैं, वे बाद में हो सकती हैं या आप उन्हें अन्य स्क्रिप्ट्स के लिए शुरुआती बिंदुओं के रूप में उपयोग कर सकते हैं। यदि आप शुरू करने के लिए सम्मेलन का पालन करते हैं, तो आपको बाद में बहुत कम आश्चर्य होगा। OTOH, यदि आप आउटपुट को किसी फ़ाइल में सहेजना चाहते हैं, तो आपको stderr को पुनर्निर्देशित करना होगा, इसलिए यह हर चीज के लिए एक व्यापार है।
जो

+1 अन्य पैराफेरेस: सुनिश्चित करें कि स्टडआउट हमेशा मशीन पठनीय है, या कम से कम एक सुसंगत प्रारूप में उपयोगी पाठ्य सामग्री शामिल है।
21

2

मैं आमतौर पर वह सब कुछ लिखता हूं जो एप्लिकेशन ऑपरेशन से संबंधित है stderr, stdoutडेटा के लिए आरक्षित है।

जैसे एक आवेदन की कल्पना करो cat। जब आप इसे इनपुट पढ़ने के लिए उपयोग करते हैं और इसे किसी अन्य एप्लिकेशन (एक पाइप के माध्यम से) में पारित करते हैं, तो आप आउटपुट को स्थिति संदेशों से अटे पड़े नहीं चाहते।

वह सब कुछ जो एक अन्य अनुप्रयोग के लिए दिलचस्प हो सकता है या मेरे आवेदन के लिए एक पोस्टप्रोसेसर हो सकता है stdout, वह सब कुछ जो केवल मेरे आवेदन के इंटर्ना से संबंधित है stderr


0

मेरी व्यक्तिगत प्राथमिकता त्रुटि संदेशों और अपवादों को stderrऔर सूचनात्मक संदेशों को भेजना है stdout। IMO, stderrकिसी भी अपवाद के लिए है और इसलिए, मेरा सम्मेलन।

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