2011-11-14 10 views
10

मैं सोच रहा था कि stderr को एकाधिक आउटपुट पर रीडायरेक्ट कैसे करें। मैंने इस स्क्रिप्ट के साथ कोशिश की, लेकिन मैं इसे सही काम करने के लिए नहीं मिला। पहली फ़ाइल में दोनों stdout और stderr होना चाहिए, और दूसरे में केवल त्रुटियां होनी चाहिए।कई फ़ाइलों में stdout/stderr को रीडायरेक्ट करना

perl script.pl &> errorTestnormal.out &2> errorTest.out 

क्या ऐसा करने का कोई बेहतर तरीका है? कोई भी सहायताकाफी प्रशंसनीय होगी। धन्यवाद।

+0

आपके द्वारा जोड़े गए टैग पर होवर, stdout/stderr = 7 कुल के लिए अनुयायियों। यदि आप उस शेल के लिए टैग शामिल करते हैं, जिसे आप उपयोग कर रहे हैं, तो मुझे आपकी समस्या पर और अधिक आंखें मिलेंगी, बैश, मुझे लगता है? सौभाग्य। – shellter

उत्तर

16

perl script.pl 2>&1 >errorTestnormal.out | tee -a errorTestnormal.out > errorTest.out

तुम क्या चाहते हो जाएगा।

यह थोड़ा गन्दा है, चलो इसे चरण-दर-चरण में जाने दें।

  • हम कह क्या STDERR पर जाने के लिए प्रयोग किया जाता है अब जाना होगा STDOUT
  • हम कह क्या STDOUT पर जाने के लिए इस्तेमाल किया अब errorTestnormal.out के लिए जाना जाएगा।

तो अब, STDOUT एक फ़ाइल में मुद्रित हो जाता है, और STDERRSTDOUT को मुद्रित हो जाता है। हम STDERR को 2 अलग-अलग फाइलों में रखना चाहते हैं, जिन्हें हम टी के साथ कर सकते हैं। टीई फ़ाइल को दिए गए पाठ को जोड़ती है, और STDOUT पर भी गूंजती है।

  • हम tee का उपयोग errorTestnormal.out में जोड़ने के लिए, तो यह अब script.pl के सभी STDOUT और STDERR उत्पादन होता है।
  • फिर, हम tee की STDOUT बारे में (जो script.pl से STDERR शामिल) errorTest.out

इस के बाद में, errorTestnormal.out सभी STDOUT उत्पादन सभी STDERR आउटपुट है, और उसके बाद। errotTest.out में केवल STDERR आउटपुट है।

+1

आप एक विद्वान और एक सज्जन हैं। शानदार जवाब, और बहुत धन्यवाद :) – kevin948

+2

एफडी 3 का उपयोग करने की कोई आवश्यकता नहीं है। आप बस कर सकते हैं: perl script.pl 2> और 1> errorTestnormal.out | टीई ... पहला पुनर्निर्देशन पाइप के साथ एफडी 2 (stderr) को जोड़ता है, और दूसरी रीडायरेक्ट फ़ाइल पर stdout। यदि आप करते हैं: perl script.pl> errorTestnormal.out 2> & 1, तो दोनों stderr और stdout फ़ाइल पर जाएं। –

+0

अच्छी पकड़, तय है कि। – Jarek

0

मुझे लगता है कि दूसरे ">" के मामले में आप errorTestnormal.out (और script.pl की त्रुटि आउटपुट) errorTest.out पर त्रुटि आउटपुट भेजने का प्रयास करते हैं।

2

मुझे थोड़ी देर के लिए इसके साथ गड़बड़ करनी पड़ी। दोनों फाइलों में stderr प्राप्त करने के लिए, केवल एक फ़ाइल में stdout डालने के दौरान (जैसे stderr त्रुटियों में .log और output.log और फिर output.log में stdout) और क्रम में यह आदेश है कि यह आदेश बेहतर है:

((sh test.sh 2>&1 1>&3 | tee errors.log) 3>&1 | tee output.log) > /dev/null 2>&1 

पिछले/dev/नुल 2> & 1 यदि आप stdout और stderr चाहते अभी भी स्क्रीन पर उत्पादन होने के लिए छोड़ा जा सकता है।