(लगभग) सब कुछ एक फ़ाइल है लेकिन सब कुछ एक नियमित फ़ाइल नहीं है। यह एक ऐसी चीज़ पर एक पाठ संपादक को कॉल करने के लिए समझ में नहीं आता है जो एक विशेष फ़ाइल है जैसे कि एक निर्देशिका, एक नेटवर्क सॉकेट, एक सीरियल पोर्ट आदि।
फ़ाइल /dev/stdout
यूनिक्स संस्करण के अनुसार कई चीजों में से एक हो सकता है:
- एक "विशेष" फ़ाइल, आमतौर पर एक चरित्र डिवाइस;
- एक "मैजिक" प्रतीकात्मक लिंक जो उस फ़ाइल को इंगित करता है जिसे एक्सेस करने की प्रक्रिया इस डिस्क्रिप्टर पर खुली है;
- उपरोक्त में से एक के लिए एक प्रतीकात्मक लिंक।
किसी भी मामले में, खोलने /dev/stdout
और इसी तरह की फाइलें एक नई फाइल डिस्क्रिप्टर बनाती हैं जो उसी फाइल से जुड़ी होती हैं जो एप्लिकेशन पहले से फाइल डिस्क्रिप्टर 1 पर खुली होती है। "स्टैंडर्ड आउटपुट" का अर्थ है फाइल डिस्क्रिप्टर 1, और यह केवल एक कन्वेंशन है जो इस फाइल डिस्क्रिप्टर का उपयोग किया जाता है। आउटपुट के लिए - कर्नेल परवाह नहीं करता है।
जब आप किसी टर्मिनल में प्रोग्राम चलाते हैं, तो टर्मिनल डिवाइस पर सभी तीन मानक डिस्क्रिप्टर (0 = मानक इनपुट, 1 = मानक आउटपुट, 2 = मानक त्रुटि) खोले जाते हैं। उस डिवाइस से पढ़ना उपयोगकर्ता द्वारा टाइप किए गए वर्ण देता है, और उस डिवाइस पर लिखना टर्मिनल विंडो में पाठ प्रदर्शित करता है। (कोई मानक तरीका नहीं है, एक टर्मिनल डिवाइस दिया गया है, आउटपुट को पढ़ने के लिए जिसे वह प्रदर्शित करता है या इसमें इनपुट इंजेक्ट करता है।)
जब आप दौड़ते हैं cat /dev/stdout
, तो यह ठीक वैसा ही काम करता है जैसे cat /dev/stdin
या cat /dev/stderr
, क्योंकि ये तीनों फाइल डिस्क्रिप्टर एक ही फाइल से जुड़े होते हैं: यह cat
टर्मिनल से पढ़ना बताता है। cat
बिना किसी तर्क के भी यही होता है।
यदि आप भागते हैं cat /dev/stdout >foo
, तो /dev/stdout
फ़ाइल को संदर्भित करेगा foo
- वह कमांड के बराबर है cat foo >foo
। cat
कार्यान्वयन के आधार पर , यह या तो त्रुटि हो सकती है (GNU संस्करण शिकायत करता है कि "इनपुट फ़ाइल आउटपुट फ़ाइल है"), या यह कुछ नहीं कर सकता क्योंकि यह फ़ाइल से पढ़ता है foo
जो खाली है ( >foo
बस इसे काट दिया गया है)। cat
उस संस्करण के साथ यह विशेष मामले का पता नहीं लगाता है, यदि foo
खाली नहीं है, तो cat /dev/stdout >>foo
या समतुल्य cat foo >>foo
फ़ाइल की सामग्री को अनिश्चित काल के लिए खुद को जोड़ देगा।
जब आप दौड़ते हैं vim /dev/stdout
, तो यह शिकायत करता है क्योंकि यह नहीं जानता कि टर्मिनल को कैसे संपादित किया जाए (इसका मतलब यह नहीं है)।