टर्मिनल लाइन इनपुट समाप्त करने के लिए Ctrl + D


21

यदि मैं करता हूँ

$ cat > file.txt

पाठ Ctrl- DCtrl-D

प्रश्न 1: अगर मैं प्रेस में प्रवेश नहीं करते, मैं क्यों प्रेस करने के लिए क्या Ctrl- Dदो बार?

यदि मैं करता हूँ

$ cat > file.txt

पा बम पश Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

पा बम पश

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

दूसरी बार फाइल 1 लाइन के साथ क्यों है?


2
स्टैकएक्सचेंज साइटों की छतरी के नीचे इस धागे का जवाब है जिसे आप देख रहे हैं: stackoverflow.com/questions/7369170/… । आशा करता हूँ की ये काम करेगा।

हाँ, भले ही अजगर संबंधित नहीं है, मेरा सवाल एक डुप्लिकेट है।
धुंध

जब आप ctrl-z टाइप करते हैं, तो क्या आप वास्तव में सिर्फ एक नया शेल प्रॉम्प्ट प्राप्त कर रहे हैं, या क्या आप भी catबंद होने के बारे में कोई संदेश प्राप्त कर रहे हैं?
मार्क प्लॉटनिक

मैं सवाल का अद्यतन कर देंगे
धुंध

जवाबों:


30

यूनिक्स में, अधिकांश वस्तुएं जिन्हें आप पढ़ और लिख सकते हैं - साधारण फाइलें, पाइप, टर्मिनल, कच्ची डिस्क ड्राइव - ये सभी फाइलों के समान हैं।

इस तरह के catअपने मानक इनपुट से एक कार्यक्रम पढ़ता है:

n = read(0, buffer, 512);

जो 512 बाइट्स के लिए पूछता है। nयदि वास्तव में कोई त्रुटि है, तो बाइट्स की संख्या, या -1 पढ़ी जाती है।

यदि आपने एक साधारण फ़ाइल के साथ बार-बार ऐसा किया है, तो आपको 512-बाइट रीड का एक गुच्छा मिलेगा, फिर फ़ाइल के टेल एंड पर कुछ कम पढ़ा जाएगा, फिर यदि आपने फाइल के पिछले हिस्से को पढ़ने की कोशिश की है। इसलिए, <= 0 catतक चलेगा n

टर्मिनल से पढ़ना थोड़ा अलग है। आपके द्वारा पंक्ति में टाइप करने के बाद, Enterकुंजी द्वारा समाप्त किया गया , readबस उस पंक्ति को लौटाता है।

कुछ विशेष वर्ण हैं जो आप टाइप कर सकते हैं। एक है Ctrl-D। जब आप इसे टाइप करते हैं, तो ऑपरेटिंग सिस्टम उस सभी मौजूदा लाइन को भेजता है जिसे आपने टाइप किया है (लेकिन Ctrl-Dस्वयं नहीं ) रीड करने वाले प्रोग्राम में। और यहाँ गंभीर बात है: अगर Ctrl-Dलाइन पर पहला चरित्र है, तो प्रोग्राम को लंबाई 0 की एक पंक्ति भेजी जाती है - जैसे कि कार्यक्रम यह देखेगा कि क्या यह सिर्फ एक साधारण फ़ाइल के अंत में मिला है। cat अलग से कुछ भी करने की आवश्यकता नहीं है , चाहे वह एक साधारण फ़ाइल या टर्मिनल से पढ़ रहा हो।

एक और खास किरदार है Ctrl-Z। जब आप इसे टाइप करते हैं, तो एक पंक्ति में कहीं भी, ऑपरेटिंग सिस्टम उस बिंदु तक टाइप किया हुआ कुछ भी डिस्कनेक्ट करता है और प्रोग्राम में एक SIGTSTP सिग्नल भेजता है, जो सामान्य रूप से इसे रोक देता है (इसे रोक देता है) और शेल पर नियंत्रण लौटाता है।

तो आपके उदाहरण में

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

आपने कुछ वर्ण टाइप किए, जिन्हें छोड़ दिया catगया था , फिर उसकी आउटपुट फ़ाइल पर कुछ भी लिखे बिना रोक दिया गया था।

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

आपने एक पंक्ति में टाइप किया, जिसने catअपनी आउटपुट फ़ाइल को पढ़ा और लिखा, और फिर Ctrl-Zरुका cat


1
ये बातें केवल विहित मोड टर्मिनलों के सच हैं । और उस स्थिति में भी उन्हें बदला जा सकता है।
15

@ माइकर्स यह सच है। यहाँ, मैं सिर्फ ओपी को क्या देख रहा था, यह समझाना चाहता था। मैंने कच्चे / -कौन टर्मिनल मोड, अन्य विशेष वर्णों का वर्णन करने पर भी विचार किया, कि उन्हें कैसे अनुकूलित किया जा सकता है, वे ओएस द्वारा कैसे भिन्न होते हैं, आदि, लेकिन जवाब को लंबे समय तक नहीं करना चाहते थे।
मार्क प्लॉटनिक

क्या उपरोक्त इसका अर्थ है कि यदि इनपुट नहीं हो रहा था cat, तो यह कि एक प्रोग्राम जो कीबोर्ड से डेटा पढ़ता है और पहली बार readएक शून्य पैदा नहीं करता था , उसे जारी रख सकता है, और नियंत्रण-डी की आवश्यकता की संख्या को निर्धारित किया जाएगा लगातार शून्य की संख्या यह तय करने के लिए आवश्यक कार्यक्रम किया गया था?
सुपरकैट

@supercat एक प्रोग्राम अगर चाहे तो पढ़ता रह सकता है। में exसंपादक, आप एक लाइन का पहला वर्ण, कार्यक्रम के बजाय बाहर निकलने की कुछ लाइनें संपादक से पता चलता है आप के रूप में एक नियंत्रण-डी टाइप करता है, तो। ( exऔर vi, कंट्रोल-डी "डाउन" के लिए एक महामारी है)। और कई शेल के साथ, यदि आप कंट्रोल-डी टाइप करते हैं, लेकिन बैकग्राउंड में जॉब चल रही है, तो शेल आपको बाहर निकलने के बजाय इसकी सूचना देगा, लेकिन यदि आप कंट्रोल-डी टाइप करते हैं, तो शेल यह निर्णय लेता है कि आप वास्तव में वैसे भी बाहर निकलना चाहते हैं और ऐसा करेंगे।
मार्क प्लॉटनिक

@MarkPlotnick: क्या कोई ऐसा तरीका है जिसके द्वारा इन शून्य-बाइट हिचकी को पाइप के माध्यम से भेजा जा सकता है?
सुपरकैट

19

ऐसा इसलिए है क्योंकि Ctrl+ Dएक हैक है।

डीप डाउन, Ctrl+ D( eofचरित्र कहे जाने के बावजूद ) वास्तव में एंड-ऑफ-फाइल का मतलब नहीं है: इसका मतलब है "अब आवेदन के लिए लंबित इनपुट भेजें"। यह वास्तव में Ctrl+ M( eol) के अर्थ के करीब है , जो लंबित इनपुट प्लस को एक नई रेखा भेजता है।

जब आप + ( तुरंत एक पंक्ति की शुरुआत में) या किसी अन्य + के बाद Ctrl+ दबाते हैं , तो लंबित इनपुट खाली होता है। इस प्रकार आवेदन 0 बाइट्स इनपुट प्राप्त करता है। एक कॉल में, 0 बाइट्स पढ़ना फ़ाइल के अंत का संकेत देता है।DCtrlMCtrlDread


जब आप Ctrl+ दबाते हैं Z, तो लंबित इनपुट को छोड़ दिया जाता है। इस प्रकार केवल वही है जो पहले ही आवेदन में भेजा गया था (जो है cat) एक नई लाइन में प्रवेश करके या Ctrl+ Dदबाने से पहले Ctrl+ Zसंसाधित किया जाता है।


1
Gille के उत्तर में से ctrl + D के बारे में अधिक जानकारी यहाँ पाई जा सकती है
रमेश

जैसा कि आपने कहा, Ctrl-D का मतलब एंड-ऑफ-फाइल नहीं है। वास्तव में इसका मतलब यह नहीं है कि क्योंकि Ctrl-D EOT (एंड-ऑफ-टेक्स्ट) है।
H2ONaCl
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.