स्क्रीन करने के लिए STDERR भी लिखें I कई आदेशों को चलाने के लिए, और सभी आउटपुट को लॉगफाइल पर कैप्चर करना चाहते हैं। मैं स्क्रीन पर किसी भी त्रुटि को मुद्रित करना चाहता हूं (या वैकल्पिक रूप से आउटपुट को किसी को मेल करें)।एक लॉगफाइल पर STDOUT और STDERR लिखें,
यहां एक उदाहरण है। निम्न आदेश तीन आदेश चलाएगा, और एक ही लॉगफाइल में सभी आउटपुट (STDOUT और STDERR) लिखेंगे। मामले में मैं की जरूरत है इसे बाद में --- मैं आमतौर पर जीता
- STDERR और STDOUT सभी आदेशों के लिए एक लॉगफ़ाइल को जाता है,:
{ command1 && command2 && command3 ; } > logfile.log 2>&1
यहाँ क्या मैं इन आदेशों में से उत्पादन के साथ क्या करना चाहते है जब तक समस्याएं न हों तब तक यहां नज़र डालें।
- स्क्रीन पर STDERR प्रिंट करें (या वैकल्पिक रूप से, पाइप से/बिन/मेल), ताकि कोई भी त्रुटि खड़ी हो और अनदेखा न हो।
यह अच्छा होगा अगर रिटर्न कोड अभी भी प्रयोग योग्य थे, ताकि मैं कुछ त्रुटि प्रबंधन कर सकूं। शायद मैं, यदि कोई त्रुटि हुई ईमेल भेजना चाहते हैं इस तरह:
{command1 & & command2 & & command3; }> logfile.log 2> & 1 || mailx -s [email protected]
समस्या मैं में चलाने कि STDERR आई/ओ पुनर्निर्देशन दौरान संदर्भ खो देता है "वहाँ एक त्रुटि थी"। ए '2> & 1' एसटीडीईआरआर को एसटीडीओयूटी में परिवर्तित करेगा, और इसलिए यदि मैं 2> error.log
यहां कुछ juicier उदाहरण हैं, तो मैं त्रुटियों को नहीं देख सकता। आइए दिखाएं कि मैं कुछ परिचित निर्माण आदेश चला रहा हूं, लेकिन मैं नहीं चाहता कि पूरे निर्माण को सिर्फ एक त्रुटि के कारण रुकना है, इसलिए मैं 'रख-रखाव' ध्वज का उपयोग करता हूं।
{ ./configure && make --keep-going && make install ; } > build.log 2>&1
या, यहाँ एक सरल (और शायद खराब) का निर्माण और तैनात स्क्रिप्ट, जो त्रुटि होने की स्थिति में जा रहा रखना होगा है।
{ ./configure && make --keep-going && make install && rsync -av --keep-going /foo devhost:/foo} > build-and-deploy.log 2>&1
मुझे लगता है कि मैं चाहता हूँ Bash I/O Redirection किसी प्रकार शामिल है, लेकिन मैं इस को समझ नहीं सकता।
आपका कोड काम करता है, लेकिन जैसे ही मैं कई आदेश चलाता हूं जैसे '(./doit && ./doit2 >> लॉग) 2> और 1 | tee -a log', फिर stitout और stderr दोनों doit और doit2 स्क्रीन पर मुद्रित है। –
ऐसा लगता है कि अगर मैं ऐसा कुछ करता हूं: '({./doit && ./stdout.sh;} >> लॉग) 2> और 1 | tee -a log' –
@StefanLasiewski - हाँ, फ़ाइल पुनर्निर्देशन केवल इसके तुरंत बाद कमांड पर लागू होता है। एक कम सबहेल में दो कमांड को समूहित करने के लिए आपका कामकाज सबसे आसान समाधान है; एक और uglier फिक्स प्रत्येक आदेश '(./doit >> लॉग और& ./doit2 >> लॉग) 2> और 1 के लिए stdout को पुनर्निर्देशित करना होगा। tee -a log' –