अजीब नियंत्रण-डी व्यवहार


9

मैं catएक बहुत ही सरल पाठ संपादक के रूप में उपयोग कर सकता हूं cat > foo.txt
अगर मैं टाइप करता हूं:

bar
baz

और फिर ctrl+ दबाएं D, यह अब इस तरह दिखता है:

$ cat > foo.txt
bar
baz^D

कर्सर के साथ ^। अगर मैं इसे दबाता हूं तो एक बार और फाइल सेव हो जाएगी। हालांकि अगर मैं कुछ भी दबाता हूं (ठीक है, शायद कुछ भी नहीं, लेकिन ज्यादातर कुछ भी), मैं बस फाइल को संपादित करना जारी रखता हूं।

क्या यह सामान्य व्यवहार है?

जवाबों:


13

हाँ। यह ^Dवास्तव में करता है: यह सिर्फ वर्तमान read(2)कॉल को रोकता है ।

यदि प्रोग्राम करता है int rdbytes = read(fd, buffer, sizeof buffer);और आप ^Dइनबेटवर्क दबाते हैं , read()तो बफर में वर्तमान में पढ़े गए बाइट्स के साथ, अपना नंबर लौटाते हैं। लाइन समाप्ति पर भी ऐसा ही होता है; \nअंत में हमेशा वितरित किया जाता है।

तो केवल एक ^Dलाइन की शुरुआत में या दूसरे के बाद वापसी ^Dका वांछित प्रभाव पड़ता है , जो ईओएफ को दर्शाता है।read()0


यह इस बात पर निर्भर करता है कि आप एक रेखा को (अनुगामी के साथ या उसके बिना) किस रूप में परिभाषित करते हैं \n.. लेकिन ^Dउत्तराधिकार में सिर्फ दो बार प्रेस करना संभव है , और एक ईओएफ स्थिति को अंतिम नईलाइन चार्ट उत्पन्न किए बिना (जैसा कि ^Dआगे करने से पहले एंटर दबाएं ) उत्पन्न करता है।
पीटर।

आप सही हैं, मैं यह उल्लेख करना भूल गया: लाइन की शुरुआत और "बस दबाए गए ^ डी" दो स्थितियां हैं जहां बफर खाली है, इसलिए ^ डी में read()वापसी होगी 0, जो ईओएफ का संकेत है।
glglgl

11

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

$ cat > foo.txt
bar
baz
^D

नियंत्रण-डी एक पंक्ति के अंत में दो बार बाहर निकलता है, एक अनुगामी न्यूलाइन चार के बिना ...
पीटर।

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