2014-07-13 10 views
7

एक फ़ाइल पर dos2unix चल रहा टर्मिनलdos2unix stderr पर प्रिंट क्यों करता है?

dos2unix: converting file <filename> to UNIX format ... 

को मुद्रित निम्नलिखित प्राप्त जब मैंने देखा इस stdout के बजाय stderr पर बाहर भेज दिया जाता है कि यह/dev/बातिल करने के लिए भेजने के द्वारा उत्पादन को दबाने के लिए मेरे प्रयास में जैसा कि मैंने उम्मीद की थी (क्योंकि यह एक सामान्य संदेश की तरह लगता है, कोई त्रुटि नहीं)। क्या इसका कोई कारण है?

+0

आप पाएंगे कि यूनिक्स ऐतिहासिक कलाकृतियों से भरा है, जैसे कि 'dd' को 'if = ...' जैसे तर्कों की आवश्यकता क्यों है, और' tar' को अग्रणी '-' के बिना स्थितित्मक तर्कों की आवश्यकता क्यों है। यह वही तरीका है ... –

+3

यदि आपको अभी तक यह नहीं मिला है, तो आप '--quiet' ध्वज – ebo

+0

का उपयोग करके इस आउटपुट को दबा सकते हैं क्योंकि यह ऊब गया है।लेकिन अतीत में आप बस इसमें पाइप इनपुट और पाइप सामान निकाल सकते थे। त्रुटियों को जहां stderr –

उत्तर

5

यूनिक्स की तरह वातावरण में यह श्रृंखला के लिए आम है प्रक्रियाएं: एक प्रोग्राम का परिणाम किसी अन्य प्रोग्राम के लिए इनपुट के रूप में उपयोग किया जाता है। परिणामडायग्नोस्टिक्स अगले प्रसंस्करण चरण को भ्रमित कर देगा। यह टर्मिनल को देखने वाले संभावित उपयोगकर्ता से डायग्नोस्टिक्स को भी छिपाएगा, जहां अगले प्रोग्राम में पाइप किए जाने वाले प्रोसेसिंग परिणाम दिखाई नहीं देते हैं।

यह stdout और stderr में परिणामों और निदान को अलग करने का कारण है। डायग्नोस्टिक्स त्रुटियों तक ही सीमित नहीं है लेकिन इसमें सबकुछ शामिल होना चाहिए जो एक प्रसंस्करण परिणाम नहीं है जिसके बाद के कार्यक्रमों की अपेक्षा की जाएगी।

वास्तविक प्रश्न के संबंध में: डॉस 2unix अक्सर फ़ाइलों को स्थानांतरित करने के लिए उपयोग किया जाता है लेकिन स्टडआउट (जब फ़ाइल नाम के बिना बुलाया जाता है, तो यह स्टडीन और आउटपुट से stdout तक पढ़ता है) आउटपुट भी कर सकता है। stdout फिर stderr से स्वतंत्र रूप से पुनर्निर्देशित किया जा सकता है। cat blados | dos2unix > blaunix पर विचार करें। आप अभी भी निदान (जिसमें त्रुटि संदेश हो सकते हैं!) देखेंगे, लेकिन प्रसंस्करण का परिणाम ब्लैनीक्स पर जाएगा।

सफलता के मामले में डायग्नोस्टिक्स मुद्रित करना इतना आम नहीं है — शायद डॉस उपयोगकर्ताओं को थोड़ा सा अनुकूलन। प्रसंस्करण परिणाम में सूचनात्मक संदेश शामिल होने पर यह बहुत खराब होगा; उदाहरण के लिए, यह एक सी फाइल तोड़ देगा।

6

कोई कारण नहीं है, लेकिन आमतौर पर stderr केवल त्रुटि आउटपुट के लिए नहीं है। यह एक और धारा है जिसे अक्सर लॉगिंग या सूचनात्मक संदेशों के लिए उपयोग किया जाता है। चूंकि एक लॉग संदेश आउटपुट नहीं है, इसलिए इसे stdout पर भेजा नहीं गया है, जो प्रोग्राम के परिणामों के लिए है।

आपके टर्मिनल पर मुद्रित होने का कारण आपके खोल का परिणाम है, और वास्तव में एप्लिकेशन द्वारा नियंत्रित नहीं किया जाता है।

+2

में रखा जाना आवश्यक है, मैं शर्त लगाता हूं कि dos2unix मैन्युअल रूप से 'tr -d '\ r' < file > file2' का उपयोग करके किया जाता था, जिस स्थिति में stdin और stdout पहले से व्यस्त हैं। –

3

, बस क्योंकि कि जिस तरह से यह लागू किया गया था ...

अगर आप the source-code की जाँच करेंगे आप देखेंगे:

... 
if (!pFlag->Quiet) 
    fprintf(stderr, _("dos2unix: converting file %s to file %s in UNIX format ...\n"), argv[ArgIdx-1], argv[ArgIdx]); 

... 
+1

और चूंकि यह [मुफ्त सॉफ्टवेयर] है (https://en.wikipedia.org/wiki/Free_software) आप अपनी जरूरतों को पूरा करने के लिए स्रोत कोड में सुधार कर सकते हैं (लेकिन आपको शायद अपने पैच प्रकाशित करना चाहिए ...) –

+0

हालांकि कड़ाई से बोली जाती है सवाल यह नहीं था कि यह लागू किया गया था (इतना स्पष्ट था), लेकिन * क्यों *। नतीजतन, कोई तर्क दे सकता है कि राज्य के पुष्टिकरण की तुलना में आपका उत्तर कम जवाब है। फिर भी इसे देखने के लिए अच्छा लगा। –

1

मैं इस एक-लाइनर का उपयोग stderr को stdout पर रीडायरेक्ट करने के लिए करता हूं, परिणामी पहली अप्रासंगिक रेखा को छोड़ देता हूं, और बाकी को वापस stderr में भेजता हूं।

dos2unix thefile 2>&1|tail -n+2 1>&2

0
Try dos2unix -q <filename> 

-q, शांत मोड --quiet। सभी चेतावनियों और संदेशों को दबाएं। वापसी मूल्य शून्य है। सिवाय जब गलत कमांड लाइन विकल्प का उपयोग किया जाता है।

संबंधित मुद्दे