STDERR और STDOUT को टी के उपयोग से दर्ज करना


16

मैं स्पष्ट नहीं क्या सबसे अच्छा आदेश पर कब्जा दोनों के लिए है हूँ STDERRऔर STDOUTएक ही फाइल का उपयोग करने के tee। मुझे पता है कि अगर मुझे किसी फ़ाइल में पाइप करना है तो मुझे रीडायरेक्ट के बाद फ़ाइलहैंडल को मैप करना होगा, अर्थात

find . >/tmp/output.txt 2>&1

यह भेजने के लिए खोल का निर्देश STDOUTकरने के लिए /tmp/output.txtऔर फिर भेजने के लिए STDERRकरने के लिए STDOUT(जो अब करने के लिए भेज रहा है /tmp/output.txt)।

2>&1फ़ाइल को पुनर्निर्देशित करने से पहले प्रदर्शन करने का प्रयास करने से वांछित प्रभाव नहीं होगा।

हालांकि जब मैं पाइप का उपयोग teeकरना चाहता हूं तो यह होना चाहिए:

find . |tee /tmp/output.txt 2>&1   # or
find . 2>&1 |tee /tmp/output.txt   # ?

जवाबों:


19

बाद वाला; यह सुनिश्चित करता है कि मूल कमांड का STDOUT और STDERR एक ही fd पर जाएं, फिर उन्हें संयुक्त रूप से टी में फीड करता है। पूर्व मामले में, यह टी कमांड का STDERR है जिसे आप अपने STDOUT के साथ जोड़ रहे हैं।


5
दिलचस्प बात यह है कि बैश मैन पेज कहता है, "यदि |&उपयोग किया जाता है, कमांड 1 की मानक त्रुटि पाइप के माध्यम से कमांड 2 के मानक से जुड़ी है; यह शॉर्टहैंड है 2>&1 |। कमांड द्वारा निर्दिष्ट किसी भी पुनर्निर्देशन के बाद मानक त्रुटि का यह निहित पुनर्निर्देशन किया जाता है।"
पीपी।

मुझे एक छोटा सी कार्यक्रम बनाना था जो इस मुद्दे को समझने stderrऔर stdoutसमझने दोनों को लिखता है । रीडायरेक्शन >और टी |ऑपरेटर दोनों आउटपुट स्ट्रीम को कैप्चर करने का प्रयास करते समय भिन्न होते हैं। पुनर्निर्देशन के लिए मुझे करना पड़ा ./testapp > /tmp/out.log 2>&1। जबकि टी के लिए मुझे करना था ./testapp 2>&1 | tee /tmp/out.log
टाइपेलोजिक

@daixtr इसके लायक है, |जिसे आम तौर पर एक पाइप ऑपरेटर के रूप में जाना जाता है। teeकेवल उस विशेष कार्यक्रम को संदर्भित करता है जिसे पाइप के दूर छोर पर लगाया जा रहा है।
मदहैटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.