क्या किसी प्रोग्राम के आउटपुट को रीडायरेक्ट करने का एक तरीका है और अभी भी यह स्टैडआउट गया है?


24

ठीक है। अगर मैं किसी प्रोग्राम के आउटपुट को किसी फ़ाइल में पुनर्निर्देशित करना चाहता था, तो मैं ऐसा कुछ करूँगा

prog > file

अगर मैं stdout और stderr दोनों को उस फ़ाइल पर पुनर्निर्देशित करना चाहता था, तो मैं करूँगा

prog > file 2>&1

यह सब ठीक है और अच्छा है अगर आप चाहते हैं कि आउटपुट फाइल में जाए। लेकिन क्या होगा अगर आप चाहते हैं कि आउटपुट फाइल में जाए और फिर भी stdout / stderr पर जाए? तो, आउटपुट फ़ाइल में सहेजा गया है, लेकिन आप अभी भी कंसोल पर देख सकते हैं जैसे प्रोग्राम चल रहा है। क्या ऐसा करने के लिए कोई रास्ता है? और यदि हां, तो कैसे?


शब्दावली: आपका मतलब है और अभी भी टर्मिनल पर जाना हैstdoutफ़ाइल-डिस्क्रिप्टर 1 है, और foo > some_fileइसका मतलब है कि केवल लिखने वाला एक फ़ाइल डिस्क्रिप्टर some_fileहै जो फू के स्टडआउट है। stdout हमेशा stdout में जाता है।
पीटर कॉर्डेस

जवाबों:


39

teeइस उद्देश्य के लिए मौजूद है; यह फ़ाइल नाम तर्क लेता है और डेटा को स्टड से स्टडआउट और फ़ाइल दोनों में पढ़ता है:

$ prog 2>&1 | tee file

10
और अतिरिक्त बैश 4 क्यूटनेस के लिए prog |& tee file:।
तोबू

1
आप एक नामित पाइप के साथ 'फ़ाइल' को भी बदल सकते हैं ...
केविन केंटु

@ केविनकांतु: एक नामित पाइप केवल एक प्रकार की फ़ाइल है; यह यूनिक्स है जहाँ सब कुछ एक फ़ाइल है। आप अपने टर्मिनल पर स्टेटस-लाइन प्रोग्रेस अपडेट देखने के लिए prog |& tee /dev/tty > fileपाइप लाइन के बीच में भी उपयोगी हो सकते हैं, जैसे foo |& tee /dev/tty | sed 's/.*\r//' > foo.logकि, लेकिन उन्हें लॉग फ़ाइल से फ़िल्टर करें। या इसका उपयोग उस पाइपलाइन को डीबग करने के लिए करें जिसे आप उस बिंदु पर डेटा देखने के लिए एक साथ हैक कर रहे हैं।
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.