सवाल एक फ़ाइल में stderr को पुनर्निर्देशित करने के लिए कैसे करें [डुप्लिकेट]


इस प्रश्न का उत्तर यहां दिया गया है:

बैकग्राउंड में चलाने के लिए कमांड डालने के लिए नोहप का उपयोग करते समय कुछ सामग्री टर्मिनल में दिखाई देती है।

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

मैं उस सामग्री को एक फाइल में सहेजना चाहता हूं।


163
2018-05-18 12:31


मूल




जवाब:


लिनक्स (और अन्य ओएस), मानक आउटपुट (stdout) और मानक त्रुटि (stderr) में दो मुख्य आउटपुट स्ट्रीम हैं। आपके द्वारा दिखाए गए संदेशों की तरह त्रुटि संदेश मानक त्रुटि पर मुद्रित होते हैं। क्लासिक रीडायरेक्शन ऑपरेटर (command > file) केवल मानक आउटपुट को रीडायरेक्ट करता है, इसलिए टर्मिनल पर मानक त्रुटि अभी भी दिखाई देती है। Stderr को रीडायरेक्ट करने के लिए, आपके पास कुछ विकल्प हैं:

  1. एक फ़ाइल में stdout रीडायरेक्ट करें और stderr किसी अन्य फ़ाइल में:

    command > out 2>error
    
  2. Stderr stdout को रीडायरेक्ट करें (&1), और फिर एक फ़ाइल में stdout पुनर्निर्देशित करें:

    command >out 2>&1
    
  3. दोनों फाइल को रीडायरेक्ट करें:

    command &> out
    

विभिन्न नियंत्रण और पुनर्निर्देशन ऑपरेटरों के बारे में अधिक जानकारी के लिए, देखें यहाँ


265
2018-05-18 12:50



इसलिए hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & या hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 या hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria हाँ। लेकिन पिछले दो आदेश बराबर हैं, वे एक ही फाइल में त्रुटि और आउटपुट दोनों भेज देंगे। - terdon♦
आपके द्वारा प्रदान किए गए लिंक में, मैं उपयोग कर सकता हूं | और 2> और 1 के बजाय वे समकक्ष हैं, आपके लिए धन्यवाद। - André M. Faria
हाय, मैं इसे सरल बनाने में सक्षम था: command 2> out। - Surya Teja Karra
@ सुर्या तिजकर जो केवल stderr को पुनर्निर्देशित करता है, लेकिन stdout नहीं। - terdon♦


ध्यान देने योग्य बात यह है कि आपके उद्देश्य और खोल के आधार पर कुछ तरीके हैं, इसलिए इसे कई पहलुओं की थोड़ी सी समझ की आवश्यकता है। सबसे आम, के माध्यम से है 2> में बोर्न की तरह गोले, जैसे कि dash (जो symlinked है /bin/sh) तथा bash; पहला डिफ़ॉल्ट और POSIX-compliant shell है और दूसरा यह है कि अधिकांश उपयोगकर्ता इंटरैक्टिव सत्र के लिए उपयोग करते हैं। वे वाक्यविन्यास और विशेषताओं में भिन्न हैं, लेकिन सौभाग्य से हमारे लिए त्रुटि स्ट्रीम पुनर्निर्देशन वही काम करता है (सिवाय इसके कि &> गैर मानक एक)। सीएसएच और इसके डेरिवेटिव के मामले में, स्टेडर रीडायरेक्शन वहाँ काफी काम नहीं करता है।

आइए वापस आओ 2> अंश। ध्यान देने के लिए दो महत्वपूर्ण बातें: > का मतलब है रीडायरेक्शन ऑपरेटर, जहां हम एक फाइल खोलते हैं और 2 पूर्णांक stderr फ़ाइल वर्णनकर्ता के लिए पूर्णांक है; वास्तव में यह वास्तव में है कि कैसे शैल भाषा के लिए POSIX मानक पुनर्निर्देशन को परिभाषित करता है खंड 2.7:

[n]redir-op word

सरल के लिए > पुनर्निर्देशन, द 1 पूर्णांक के लिए निहित है stdout, अर्थात। echo Hello World > /dev/null बस वही है echo Hello World 1>/dev/null। ध्यान दें, कि पूर्णांक या पुनर्निर्देशन ऑपरेटर को उद्धृत नहीं किया जा सकता है, अन्यथा शैल उन्हें इस तरह पहचान नहीं पाता है, और इसके बजाय टेक्स्ट की शाब्दिक स्ट्रिंग के रूप में व्यवहार करता है। रिक्ति के लिए, यह महत्वपूर्ण है कि पूर्णांक पुनर्निर्देशन ऑपरेटर के बगल में सही है, लेकिन फ़ाइल या तो रीडायरेक्शन ऑपरेटर के बगल में हो सकती है या नहीं, यानी। command 2>/dev/null तथा command 2> /dev/null ठीक काम करेगा।

खोल में ठेठ कमांड के लिए कुछ हद तक सरलीकृत वाक्यविन्यास होगा

 command [arg1] [arg2]  2> /dev/null

यहां की चाल यह है कि पुनर्निर्देशन कहीं भी दिखाई दे सकता है। वह दोनों है 2> command [arg1] तथा command 2> [arg1] वैध हैं। ध्यान दें कि के लिए bash खोल, वहाँ मौजूद है &> एक ही समय में दोनों stdout और stderr धाराओं को पुनर्निर्देशित करने का तरीका, लेकिन फिर से - यह विशिष्ट है और यदि आप स्क्रिप्ट की पोर्टेबिलिटी के लिए प्रयास कर रहे हैं, तो यह काम नहीं कर सकता है। यह भी देखें उबंटू विकी तथा &> और 2> और 1 के बीच क्या अंतर है

ध्यान दें:  > पुनर्निर्देशन ऑपरेटर ट्रंकेटसफ़ाइल मौजूद है और फ़ाइल को ओवरराइट करता है, अगर फ़ाइल मौजूद है। 2>> संलग्न करने के लिए इस्तेमाल किया जा सकता है stderr फाइल करने के लिए।

यदि आप नोटिस कर सकते हैं, > एक एकल कमांड के लिए है। स्क्रिप्ट के लिए, हम पूरी स्क्रिप्ट के stderr स्ट्रीम को बाहर से बाहर रीडायरेक्ट कर सकते हैं myscript.sh 2> /dev/null या हम इसका उपयोग कर सकते हैं अंतर्निहित निष्पादन। अंतर्निहित निष्पादन में पूरे शेल सत्र के लिए स्ट्रीम को फिर से चलाने की शक्ति है, इसलिए बोलने के लिए, चाहे इंटरैक्टिव या स्क्रिप्ट के माध्यम से। कुछ इस तरह

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

इस उदाहरण में, लॉग फ़ाइल दिखाना चाहिए stat: cannot stat '/etc/non_existing_file': No such file or directory

फिर भी एक और तरीका कार्यों के माध्यम से है। जैसा kopciuszek अपने जवाब में उल्लेख किया है, हम पहले से जुड़े पुनर्निर्देशन के साथ समारोह घोषणा लिख ​​सकते हैं, यानी

some_function(){
    command1
    command2
} 2> my_log_file.txt

5
2018-05-03 07:48