मैं टेक्स्ट एडिटर के साथ / dev / stdout क्यों नहीं पढ़ सकता / सकती हूं?


9

मैंने अभी सीखना शुरू किया कि लिनक्स पर सब कुछ एक फ़ाइल टीएम कैसे है , जिसने मुझे आश्चर्यचकित कर दिया कि अगर मैं सचमुच / dev / stdout से पढ़ता हूं तो क्या होगा?

$ cat /dev/stdout 
^C
$ tail /dev/stdout 
^C

(क्या ^Cयह कार्यक्रम लटकने के बाद मुझे मार रहा है)।

जब मैं कोशिश करता vimहूं, तो मुझे अकल्पनीय संदेश मिलता है: "/ dev / stdout" कोई फ़ाइल नहीं है। दम तोड़ देना!

तो क्या देता है, जब मैं इन "फाइलों" को पढ़ने की कोशिश करता हूं तो मुझे हैंगअप या त्रुटि संदेश क्यों मिल रहे हैं?


1
क्या vim एक फाइल पर विचार करता है और "nix" में "सब कुछ एक फाइल है" (कोई संबद्ध ट्रेडमार्क नहीं है) का मतलब एक ही बात नहीं है। उदाहरण देखें # 1 और # 2
गोल्डीलॉक्स

जवाबों:


11

मुझे हैंगअप क्यों मिल रहा है

आपको "हैंगअप" नहीं मिल रहा है cat(1)और tail(1), वे केवल पढ़ने पर रोक रहे हैं। cat(1)इनपुट की प्रतीक्षा करता है, और जैसे ही यह पूरी लाइन देखता है, प्रिंट करता है:

$ cat /dev/stdout
foo
foo
bar
bar

यहाँ मैंने टाइप किया fooEnterbarEnterCTRL- D

tail(1)इनपुट की प्रतीक्षा करता है, और इसे तभी प्रिंट करता है जब यह पता लगा सकता है EOF:

$ tail /dev/stdout
foo
bar
foo
bar

यहाँ मैंने फिर से टाइप किया fooEnterbarEnterCTRL- D

या त्रुटि संदेश

विम केवल एक ही है जो आपको एक त्रुटि देता है। यह ऐसा इसलिए करता है क्योंकि यह खिलाफ चलता है , और यह पाता है कि इसके पास कुछ सेट नहीं है ।stat(2)/dev/stdoutS_IFREG

/dev/stdoutएक फ़ाइल है, लेकिन एक नियमित फ़ाइल नहीं है । वास्तव में, कर्नेल में कुछ नृत्य है जो इसे फाइलसिस्टम में एक प्रविष्टि देता है। लिनक्स पर:

$ ls -l /dev/stdout
lrwxrwxrwx 1 root root 15 May  8 19:42 /dev/stdout -> /proc/self/fd/1

OpenBSD पर:

$ ls -l /dev/stdout
crw-rw-rw-  1 root  wheel   22,   1 May  7 09:05:03 2015 /dev/stdout

FreeBSD पर:

$ ls -l /dev/stdout
lrwxr-xr-x  1 root  wheel  4 May  8 21:35 /dev/stdout -> fd/1

$ ls -l /dev/fd/1
crw-rw-rw-  1 root  wheel  0x18 May  8 21:35 /dev/fd/1

5

(लगभग) सब कुछ एक फ़ाइल है लेकिन सब कुछ एक नियमित फ़ाइल नहीं है। यह एक ऐसी चीज़ पर एक पाठ संपादक को कॉल करने के लिए समझ में नहीं आता है जो एक विशेष फ़ाइल है जैसे कि एक निर्देशिका, एक नेटवर्क सॉकेट, एक सीरियल पोर्ट आदि।

फ़ाइल /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 >foocatकार्यान्वयन के आधार पर , यह या तो त्रुटि हो सकती है (GNU संस्करण शिकायत करता है कि "इनपुट फ़ाइल आउटपुट फ़ाइल है"), या यह कुछ नहीं कर सकता क्योंकि यह फ़ाइल से पढ़ता है fooजो खाली है ( >fooबस इसे काट दिया गया है)। catउस संस्करण के साथ यह विशेष मामले का पता नहीं लगाता है, यदि fooखाली नहीं है, तो cat /dev/stdout >>fooया समतुल्य cat foo >>fooफ़ाइल की सामग्री को अनिश्चित काल के लिए खुद को जोड़ देगा।

जब आप दौड़ते हैं vim /dev/stdout, तो यह शिकायत करता है क्योंकि यह नहीं जानता कि टर्मिनल को कैसे संपादित किया जाए (इसका मतलब यह नहीं है)।


2

catऔर tailफ़ाइल के अंत के बाद वैकल्पिक सामग्री की तलाश कर रहे हैं। /dev/stdoutखुला रहता है, इसलिए catऔर tailबस देखते रहो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.