स्टड से `कम` डेटा कैसे लेता है जबकि उपयोगकर्ता से कमांड पढ़ने में सक्षम है?


47

जैसा कि आप में से अधिकांश ने कई बार किया है, लंबे पाठ का उपयोग करना सुविधाजनक है less:

some_command | less

अब इसका स्टड एक पाइप (FIFO) से जुड़ा है। यह अभी भी ऊपर / नीचे / जैसे कमांड कैसे पढ़ सकता है?


15
lessस्टड से प्रदर्शित करने के लिए डेटा पढ़ता है, और यह ट्टी से कमांड पढ़ता है। वे अलग चीजें हैं।
विलियम पुरसेल

2
@WilliamPursell हाँ मुझे पता है। लेकिन केवल एक मानक इनपुट स्ट्रीम है, है ना?
जुग

4
हां, एक इनपुट स्ट्रीम और एक ट्टी है। lessस्टड से डेटा पढ़ता है, और ट्टी से कमांड करता है।
विलियम पर्सेल

जवाबों:


52

जैसा कि विलियम पर्सेल ने उल्लेख किया है , lessटर्मिनल से उपयोगकर्ता के कीस्ट्रोक्स को पढ़ता है। यह स्पष्ट रूप से खुलता है /dev/tty, नियंत्रण टर्मिनल; यह एक फाइल डिस्क्रिप्टर देता है, जो मानक इनपुट से अलग है, जिससे यह उपयोगकर्ता के इंटरेक्टिव इनपुट को पढ़ सकता है। यदि आवश्यक हो तो यह अपने मानक इनपुट से प्रदर्शित करने के लिए डेटा को एक साथ पढ़ सकता है। ( यदि आवश्यक हो तो यह सीधे टर्मिनल पर भी लिख सकता है।)

इसे आप रनिंग के जरिए देख सकते हैं

some_command | strace -o less.trace -e open,read,write less

इनपुट से बाहर निकलें, बाहर निकलें less, और उसकी सामग्री को less.traceदेखें: आप इसे खोलकर देखेंगे /dev/tty, और दोनों फाइल डिस्क्रिप्टर 0 से पढ़ेंगे और जो भी खोला गया था, उसमें से एक को लौटा दिया जाएगा /dev/tty(संभावित 3)।

यह उन कार्यक्रमों के लिए सामान्य अभ्यास है जो यह सुनिश्चित करना चाहते हैं कि वे टर्मिनल से पढ़ रहे हैं और लिख रहे हैं। एक उदाहरण SSH है, उदाहरण के लिए जब वह पासवर्ड या पासफ़्रेज़ मांगता है।

जैसा कि विद्वानों द्वारा समझाया गया है , यदि /dev/ttyनहीं खोला जा सकता है , तो lessइसकी मानक त्रुटि (फ़ाइल विवरण 2) से पढ़ी जाएगी। lessका उपयोग /dev/tty177 संस्करण में पेश किया गया था, 2 अप्रैल 1991 को जारी किया गया था।

यदि आप चलने की कोशिश करते हैं cat /dev/tty | less, जैसा कि हेगन वॉन एटिजन द्वारा सुझाया गया है , तो इसे खोलने में सफलता मिलेगी लेकिन इसे बंद करने तक कोई इनपुट नहीं मिलेगा । तो आप स्क्रीन को खाली देखेंगे, और तब तक और कुछ नहीं जब तक आप उसे मारने (या किसी अन्य तरीके से मारने ) के लिए नहीं दबाते ; तब जो कुछ भी आपने टाइप किया था उसे दिखाएगा , और आपको इसे नियंत्रित करने की अनुमति देगा।less/dev/ttycatCtrlCcatlesscat


4
@HagenvonEitzen आपका कंप्यूटर फट जाएगा! यह उस तरह है जैसे किर्क और स्पॉक ने मुड के एंड्रॉइड को क्रैश कर दिया था।
बमर

7
@ हेगनवोनइटेन वाह। बिल्ली का दोहरा उपयोग बेकार है । मैं प्रसन्न हूँ।
एंड्रयू हेनले

8
@ मुझे लगता है कि एंड्रयू की बात यह है कि cat blah |इसके द्वारा प्रतिस्थापित किया जा सकता है < blah, और यहां तक ​​कि इस मामले में अनावश्यक less blahभी काम करता है (अच्छी तरह से less -f /dev/tty)। लेकिन से पढ़ /dev/ttyएक विशेष मामले का एक सा है, और सभी तीन वेरिएंट है ( cat /dev/tty | less, less < /dev/ttyऔर less -f /dev/tty) से भिन्न परिणाम।
स्टीफन किट

1
क्या देव / देवता हमेशा किसी न किसी तरह से सही जगह की ओर इशारा करते हैं? मुझे लगता है कि आपको आमतौर पर / dev / ptsX का उपयोग करने की आवश्यकता होगी?
StarWeaver

2
@StarWeaver इस सवाल को /dev/ttyऔर के बीच के अंतर के बारे में देखता है /dev/pts/...
स्टीफन किट

26

UNIX उपयोगकर्ताओं को इनपुट पढ़ने के दो तरीके देता है जबकि स्टड पुनर्निर्देशित किया गया है:

  • मूल विधि stderr से पढ़ने के लिए है । Stderr लिखने और पढ़ने के लिए खुला है और POSIX में अभी भी इसका उल्लेख है।

  • बाद में UNIX संस्करणों ने (1979 के आसपास) एक /dev/ttyड्राइवर इंटरफ़ेस जोड़ा जो एक प्रक्रिया के नियंत्रित ट्टी को खोलने की अनुमति देता है। चूँकि एक नियंत्रित ट्टी के बिना प्रक्रियाएँ होती हैं, इसलिए संभव है कि खोलने का प्रयास /dev/ttyविफल हो जाए। इसलिए अनुकूल लिखित सॉफ्टवेयर में मूल विधि का कमबैक है और फिर वह stderr से पढ़ने की कोशिश करता है।


11
Stderr से पढ़ें? कुछ नया सीखा।
IBug

1
मुझे खुशी है कि किसी को पुराने तरीके याद हैं।
जोशुआ

3
क्या कारण है कि पढ़ने के लिए stderr का उपयोग किया जाता है, क्योंकि यह कम से कम पुनर्निर्देशित होने की संभावना है? मैं इसके और stdout के बीच कोई अन्य अंतर नहीं देखता (या पुनर्निर्देशन से पहले उस मैटर स्टड के लिए)।
ctrl-alt-delor-

4
हां, ऐसा इसलिए है क्योंकि यह फाइल डिस्क्रिप्टर है जिसमें रीडायरेक्ट होने का कम से कम मौका है।
शास्त्री

@ ctrl-alt-delor: यह शेल के लिए विशिष्ट था / है, जो dup()स्टड , स्टडआउट , और स्टडर के साथ चल रहा है, सभी को एक ही फ़ाइल विवरण के लाइसेंस प्राप्त किए जा रहे हैं, हालांकि, सभी ट्टी पर खुले हैं। (जाहिर तौर पर POSIX को अभी भी आवश्यकता है या सुझाव दें (यह उत्तर नहीं कहता है) कि stderr एक रीड / राइट एफडी हो, कुछ इस तरह से नहीं खोला गया open("/dev/ttyS0", O_WRONLY)। पढ़ना stderr उस मामले में विफल हो जाएगा।)
पीटर कॉर्डेस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.