टी को पाइप से पूरा आउटपुट नहीं मिलता है


12

मेरे पास एक स्क्रिप्ट निष्पादित कमांड है जैसे:

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH;./some_app -i $INDEX | tee $LOG
echo "Number of errors: $(grep "ERROR" $LOG | wc -l)"

समस्या शायद पाइप में है tee। इससे पूरा आउटपुट नहीं मिल रहा है। जब अनुप्रयोग आउटपुट की अंतिम कुछ पंक्तियाँ उद्धृत करता है (आमतौर पर जो एक घातक त्रुटि वाले होते हैं) गायब हैं। जब मैं ऐप को पाइप के बिना चलाता हूं तो मुझे teeआउटपुट में मिलता है।

मैं सभी आउटपुट को पूरा करने के लिए स्क्रिप्ट को कैसे प्रतीक्षा करने के लिए बाध्य कर सकता हूं?


क्या यह ठीक काम करता है यदि आप इसे एक फ़ाइल पर भेजते हैं, तो stdout नहीं?
पायलट 6

जवाबों:


23

घातक त्रुटि शायद STDERR (2) में आ रही है, STDOUT (1) के लिए नहीं। आप STDERR को STDOUT में पुनर्निर्देशित कर सकते हैं 2>&1और फिर पाइप को इसे भी पकड़ना चाहिए।

./some_app -i $INDEX 2>&1 | tee $LOG

यदि आपके पास शीर्ष पर बफ़रिंग समस्याएँ हैं, तो आप इसे किसी अप्रभावित स्थिति में बाध्य कर सकते हैं:

stdbuf -o0 ./some_app -i $INDEX 2>&1 | tee $LOG

अच्छा, हम करीब आ रहे हैं। अब मैं देखता हूं कि घातक त्रुटि मुद्रित हो रही है लेकिन फिर से यह पूरी नहीं हुई है। त्रुटि के साथ लाइन सिर्फ मध्य में समाप्त होती है और इको आउटपुट जारी रहता है। अभी भी निस्तब्धता बफर के साथ कुछ समस्या है या बस उस हिस्से को पूरा करने के लिए इंतजार कर रहा है।
लादिस्लाव मृका

संपादित। मेरे अनुभव में काफी दुर्लभ है कि कुछ तो पूरी तरह से बाहर निकलने पर बफ़र्स के माध्यम से फिसल जाता है लेकिन यह जाने लायक है।
ओली

1
किया हुआ! धन्यवाद। मैं बहुत सारे सवाल पूछ रहा हूं, लेकिन क्या किसी को यह समझ में आता है कि मुझे अन्य प्रक्रिया के लिए पाइपिंग बंद करने की आवश्यकता क्यों है?
लदिस्लाव मृणका

@ कोई बहुत अच्छा!
पायलट 6

6

चूंकि त्रुटि संदेश आम तौर पर STDERR (फ़ाइल डिस्क्रिप्टर 2) पर दिखाए जाते हैं, आपको STDOUT और STDERR दोनों को पुनर्निर्देशित करने की आवश्यकता है tee:

./some_app -i "$INDEX" |& tee "$LOG"

जब आप करते हैं तो ./some_app -i $INDEX | tee $LOGआप केवल एसटीडी के बारे में पुनर्निर्देशित कर रहे हैं tee

|& कारण STDOUT और STDERR दोनों को पुनर्निर्देशित किया जाएगा।

यदि आप केवल STDOUT (जैसा आप थे) को पुनर्निर्देशित नहीं कर सकते:

./some_app -i "$INDEX" | tee "$LOG"

दूसरी ओर यदि आप केवल STDERR को पुनर्निर्देशित करना चाहते हैं:

./some_app -i "$INDEX" 2>&1 >/dev/null | tee "$LOG"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.