linux आउटपुट को एक फ़ाइल और stdout पर रीडायरेक्ट कैसे करें




bash file-io (8)

बैश में, कॉलिंग foo stdout पर उस कमांड से कोई भी आउटपुट प्रदर्शित करेगा।

कॉलिंग foo > output उस आदेश से किसी भी आउटपुट को निर्दिष्ट फ़ाइल में रीडायरेक्ट करेगा (इस मामले में 'आउटपुट')।

क्या आउटपुट को फ़ाइल में रीडायरेक्ट करने का कोई तरीका है और इसे स्टडआउट पर प्रदर्शित किया गया है?


tail -f output का उपयोग करना चाहिए।


< command > |& tee filename # यह एक सामग्री के रूप में कमांड स्थिति के साथ एक फ़ाइल "फ़ाइल नाम" बना देगा, अगर कोई फ़ाइल पहले से मौजूद है तो यह अस्तित्व में सामग्री को हटा देगी और कमांड स्थिति लिख जाएगी।

< command > | tee >> filename < command > | tee >> filename # यह < command > | tee >> filename स्थिति जोड़ देगा लेकिन यह standard_output (स्क्रीन) पर कमांड स्थिति मुद्रित नहीं करता है।

मैं स्क्रीन पर "गूंज" का उपयोग करके कुछ प्रिंट करना चाहता हूं और उस फ़ाइल को प्रतिबिंबित करना चाहता हूं जो फ़ाइल को प्रतिबिंबित करता है

echo "hi there, Have to print this on screen and append to a file" 

एक और तरीका जो मेरे लिए काम करता है,

<command> |& tee  <outputFile>

जैसा कि gnu bash मैनुअल में दिखाया गया है

उदाहरण:

ls |& tee files.txt

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

अधिक जानकारी के लिए, redirection देखें


आप मुख्य रूप से solution उपयोग कर सकते solution , लेकिन यदि आप आउटपुट फ़ाइल को ओवरराइट नहीं करना चाहते हैं तो आपको को -ए विकल्प के साथ लिखना चाहिए:

ls -lR / | tee -a output.file

टीई इसके लिए बिल्कुल सही है, लेकिन यह नौकरी भी करेगा

ls -lr / > output | cat output

$ program [arguments...] 2>&1 | tee outfile

2>&1 stderr और stdout धाराओं को डंप करता है। tee outfile उस स्ट्रीम को लेता है जो इसे प्राप्त करता है और इसे स्क्रीन पर और फ़ाइल "आउटफाइल" में लिखता है।

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

समस्या (विशेष रूप से जब stdout और stderr धाराओं को मिलाकर) यह है कि कार्यक्रम द्वारा बहने वाली धाराओं पर निर्भरता है। यदि, उदाहरण के लिए, stdout के लिए सभी लिखने को फ़्लश नहीं किया जाता है , लेकिन stderr के लिए सभी लिखते हैं , तो वे आउटपुट फ़ाइल और स्क्रीन पर कालक्रम क्रम से समाप्त हो जाएंगे।

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

अद्यतन: प्रोग्राम पैकेज, expect पैकेज का हिस्सा, बफरिंग समस्या को हल करेगा। यह स्क्रीन पर लिखने और तुरंत फ़ाइल करने के लिए stdout और stderr का कारण बनता है और उन्हें संयुक्त होने पर और tee को रीडायरेक्ट करते समय सिंक में रखता है। उदाहरण के लिए:

$ unbuffer program [arguments...] 2>&1 | tee outfile

इस उपयोग के मामले से बोनस का जवाब मुझे यहां लाया:

ऐसे मामले में जहां आपको इसे किसी अन्य उपयोगकर्ता के रूप में करने की आवश्यकता है

echo "some output" | sudo -u some_user tee /some/path/some_file

ध्यान दें कि इको आपके जैसा होगा और फ़ाइल लिखने के रूप में "some_user" होगा जो काम नहीं करेगा यदि आप गूंज को "some_user" के रूप में चलाते हैं और आउटपुट को "some_file" के साथ रीडायरेक्ट करते हैं क्योंकि फ़ाइल रीडायरेक्ट होगा जैसे तुम।

संकेत: टी-फ्लैग के साथ संलग्न करने का भी समर्थन करता है, अगर आपको किसी फ़ाइल में एक लाइन को प्रतिस्थापित करने की आवश्यकता है, तो दूसरे उपयोगकर्ता के रूप में आप वांछित उपयोगकर्ता के रूप में निष्पादित कर सकते हैं।


कुछ जोड़ने के लिए ...

पैकेज unbuffer फेडोरा और redhat यूनिक्स रिलीज के तहत कुछ पैकेज के साथ मुद्दों का समर्थन है।

परेशानियों को दूर करना

मेरे लिए काम करने के बाद

bash myscript.sh 2>&1 | tee output.log

धन्यवाद और आपके इनपुट ने मुझे बहुत समय बचाया ..





stdout