Ctrl-D (EOF) शेल से बाहर क्यों निकलता है?


68

क्या आप वस्तुतः इस एस्केप सीक्वेंस को इनपुट करके "एक फाइल को समाप्त कर रहे हैं", यानी इंटरेक्टिव शेल सेशन को शेल की वास्तविक फाइल स्ट्रीम के रूप में देखा जाता है, किसी अन्य फाइल स्ट्रीम की तरह? यदि हां, तो कौन सी फाइल?

या, Ctrl+ Dसिग्नल सिर्फ एक प्लेसहोल्डर है जिसका अर्थ है "उपयोगकर्ता ने इनपुट प्रदान करना समाप्त कर दिया है और आप समाप्त कर सकते हैं"?



6
FYI करें, बश में आप set -o ignoreeofउस व्यवहार को बदलने के लिए कर सकते हैं ।
कीथ

मुझे भी यही समस्या थी। मेरी त्रुटि यह थी कि मैंने गलती से कोनसोल प्रोफाइल शॉर्टकट को "Ctrl + d" को सौंपा था। मेरा सबसे गौरव का क्षण नहीं।
ब्रायन सिमोंसेन

जवाबों:


78

^Dचरित्र (भी रूप में जाना जाता \04या 0x4, संचरण के अंत यूनिकोड में) के लिए डिफ़ॉल्ट मान है eofकर्नेल में टर्मिनल या छद्म टर्मिनल चालक की विशेष नियंत्रण चरित्र पैरामीटर (अधिक सटीक के ttyसीरियल या छद्म से जुड़ी लाइन अनुशासन tty डिवाइस )। ऐसा इसलिए है c_cc[VEOF]की termiosसंरचना TCSETS के लिए पारित / TCGETS ioctlटर्मिनल उपकरण को एक मुद्दों चालक के व्यवहार को प्रभावित करने के लिए।

जो सामान्य कमांड भेजता ioctlsहै, वह sttyकमांड है।

सभी मापदंडों को पुनः प्राप्त करने के लिए:

$ स्टटी -ए
गति 38400 बॉड; पंक्तियाँ 58; कॉलम 191; पंक्ति = 0;
intr = ^ C; छोड़ना = ^ \ _; मिटा = ^ ;; मार = ^ यू; eof = ^ D ; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^ Q; रोक = ^ एस; संदिग्ध = ^ जेड; rprnt = ^ आर; वासे = ^ डब्ल्यू; lnext = ^ V; flush = ^ O;
मिनट = 1; समय = 0;
-पारेंब-सिरोपड cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
इसिग इकोनोन एक्षेतेन इको इको इको-टेकोनल -नोफ्लेश -एक्सकेस -टॉस्टॉप -टेकॉपर्ट इकोक्टल इकोक

eofटर्मिनल डिवाइस icanonमोड में होने पर यह पैरामीटर केवल प्रासंगिक है।

उस मोड में, टर्मिनल ड्राइवर (टर्मिनल एमुलेटर नहीं) एक बहुत ही सरल लाइन संपादक को लागू करता है , जहां आप Backspaceएक चरित्र Ctrl-Uको मिटाने के लिए, पूरी लाइन को मिटाने के लिए टाइप कर सकते हैं ... जब कोई एप्लिकेशन टर्मिनल डिवाइस से पढ़ता है, तो यह तब तक कुछ भी नहीं देखता है। आप Returnउस बिंदु को दबाते हैं , जिसमें read()अंतिम LFवर्ण सहित पूर्ण पंक्ति देता है (डिफ़ॉल्ट रूप से, टर्मिनल ड्राइवर CRआपके टर्मिनल द्वारा भेजे गए का अनुवाद भी करता Returnहै LF)।

अब, यदि आप बिना दबाव डाले अब तक जो कुछ भी लिखना चाहते हैं, उसे भेजना चाहते हैं, तो आप पात्र में Enterप्रवेश कर सकते हैं eof। टर्मिनल एमुलेटर से उस चरित्र को प्राप्त करने पर, टर्मिनल ड्राइवर लाइन की वर्तमान सामग्री को प्रस्तुत करता है, ताकि उस readपर कर रहा एप्लिकेशन इसे प्राप्त कर लेगा (और इसमें एक अनुगामी LFचरित्र शामिल नहीं होगा )।

अब, यदि वर्तमान लाइन खाली थी, और बशर्ते आवेदन में पहले से दर्ज लाइनों को पूरी तरह से पढ़ा readहोगा , तो 0 वर्ण वापस आ जाएगा।

यह एप्लिकेशन को फ़ाइल के अंत का संकेत देता है (जब आप किसी फ़ाइल से पढ़ते हैं, तो आप तब तक पढ़ते हैं जब तक कि पढ़ने के लिए अधिक कुछ नहीं हो)। इसलिए इसे eofवर्ण कहा जाता है , क्योंकि इसे भेजने से एप्लिकेशन यह देख सकता है कि कोई और इनपुट उपलब्ध नहीं है।

अब, आधुनिक गोले, उनके संकेत पर टर्मिनल को icanonमोड में सेट नहीं करते हैं क्योंकि वे अपने स्वयं के लाइन संपादक को लागू करते हैं जो टर्मिनल चालक द्वारा निर्मित एक की तुलना में बहुत अधिक उन्नत है। हालांकि, अपने स्वयं के लाइन संपादक में , उपयोगकर्ताओं को भ्रमित करने से बचने के लिए, वे ^Dचरित्र देते हैं (या टर्मिनल की eofसेटिंग कुछ के साथ है) एक ही अर्थ (संकेत देने के लिए eof)।


मुझे पता था कि एक बार जब मैंने यह टिप्पणी पढ़नी शुरू की कि यह स्टीफन द्वारा लिखी गई है :) आप, स्टीफन, मेरे बैश हीरो हैं, और मैं व्यंग्यात्मक नहीं हूं। अगर आप कभी NYC में हैं, तो मैं आपके साथ लंच करना चाहता हूं और अपना दिमाग चुनूंगा।
ग्रीग लेवेंटल

@GreggLeventhal। धन्यवाद। मुझे NYC में कभी भी जाने की संभावना बहुत ही पतली होती है।
स्टीफन चेज़लस

यह 7-बिट एएससीआईआई में भी ईओटी है
बनुआंगिन

9

CTRL_D केवल एक संकेत है जो कह रहा है कि यह एक पाठ स्ट्रीम का अंत है। आप इसके साथ एक फ़ाइल समाप्त नहीं करते हैं, आप अपनी इनपुट स्ट्रीम को टाइप करके समाप्त करते हैं। इसके अलावा CTRL_D किसी भी वर्ण या बाइट के लिए खड़ा नहीं है क्योंकि आप उपकरण हेक्सडंप के साथ पता लगा सकते हैं:

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt

5
और इसका कारण यह है कि शेल समाप्त होता है शेल मूल रूप से एक प्रक्रिया है जो इनपुट को स्वीकार करता है और इसके साथ सामान करता है। जब आप इसे बताते हैं कि कोई और इनपुट आने वाला नहीं है, तो शेल के लिए और कुछ नहीं करना है।
जेनी डी

मुझे लगता है कि ईओएफ अनुक्रम एक पाठ फ़ाइल द्वारा, कहते हैं, और ओएस द्वारा उत्पन्न नहीं है, यह रिपोर्ट करने के लिए है कि पढ़ने के लिए अधिक डेटा नहीं है। मुझे लगता है कि मैं वास्तव में पूछ रहा हूं कि क्या इंटरेक्टिव टर्मिनल सत्र को शेल द्वारा वास्तविक फ़ाइल स्ट्रीम के रूप में देखा जाता है, किसी अन्य फ़ाइल स्ट्रीम की तरह।
गीब

स्पष्ट करने के लिए मूल प्रश्न को ही संपादित किया।
गीब

2
हां, जो धारा टकराती है वह किसी अन्य की तरह एक इनपुट स्ट्रीम है। CTRL_D संकेत देता है कि इनपुट स्ट्रीम अपने अंत में है और बैश छोड़ सकते हैं।
थोरस्टेन स्टैक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.