स्टडिन इनपुट के अंत का संकेत कैसे दें


82
  1. बैश में, मैंने सीखा कि अंतिम संकेत को यहां दस्तावेज़ द्वारा बदला जा सकता है। लेकिन डिफ़ॉल्ट रूप से मैं स्टडिन इनपुट के अंत का संकेत कैसे दे सकता हूं?
  2. मुझे पता चला कि बिल्ली और चर्डेट के साथ, उनके स्टडिन इनपुट को Ctrl + d द्वारा समाप्त होने के रूप में संकेत दिया जा सकता है। लेकिन मुझे याद है कि Ctrl + d और Ctrl + c एक रनिंग कमांड के निष्पादन को समाप्त करने के समान हैं। तो क्या मैं गलत हूं?

जवाबों:


114

Ctrl+D, जब एक टर्मिनल पर एक लाइन की शुरुआत में टाइप किया जाता है, तो इनपुट के अंत का प्रतीक है। यह यूनिक्स अर्थ में एक संकेत नहीं है: जब कोई एप्लिकेशन टर्मिनल से पढ़ रहा है और उपयोगकर्ता दबाता है Ctrl+D, तो एप्लिकेशन को सूचित किया जाता है कि फाइल का अंत हो गया है (जैसे कि यह किसी फाइल से पढ़ रहा हो और पास हो गया हो अंतिम बाइट)।

Ctrl+Cएक संकेत भेजता है, SIGINT । डिफ़ॉल्ट रूप से SIGINT (इंटरप्ट सिग्नल) अग्रभूमि अनुप्रयोग को मारता है, लेकिन एप्लिकेशन सिग्नल को पकड़ सकता है और कुछ अलग तरीके से प्रतिक्रिया कर सकता है (उदाहरण के लिए, शेल स्वयं सिग्नल को पकड़ता है और आपके द्वारा टाइप की गई लाइन को रोक देता है, लेकिन यह नहीं करता है ' t बाहर निकलना, यह एक नया संकेत दिखाता है और नई कमांड लाइन की प्रतीक्षा करता है)।

आप एंड-ऑफ़-फ़ाइल और SIGINT से जुड़े वर्णों को sttyकमांड के साथ बदल सकते हैं , उदाहरण के stty eof aलिए a, एंड-ऑफ़-फ़ाइल वर्ण बना देगा, और stty intr ^-SIGINT वर्ण को अक्षम कर देगा। यह शायद ही उपयोगी है।


धन्यवाद! क्या Ctrl+Dइसका मतलब Ctrl और कैपिटल डी है या इससे कोई फर्क नहीं पड़ता?
टिम

5
@ समय: यह कम मामला है जो आप चाहते हैं ... राजधानियों के साथ कीबोर्ड कमांड लिखने का सम्मेलन आता है क्योंकि कीबोर्ड पर लेबल हमेशा राजधानियों में होते हैं और वर्णित की जा रही बात एक कुंजी दृश्य है जो वास्तविक चरित्र कोड नहीं है जो प्रोग्राम देखता है। हाँ यह कभी-कभी भ्रामक है।
कालेब

@ कालेब: धन्यवाद! कोई यह कैसे बताएगा कि कुंजी पूंजी में है? या ऐसा कोई मामला है?
टिम

@ एक टर्मिनल पर, कुंजी संयोजन Ctrl+Shift+Dऔर Ctrl+Dवैसे भी एक ही चरित्र भेजते हैं (चरित्र संख्या 4, आमतौर पर कहा जाता है Ctrl+D)।
गाइल्स

2
@ समय टर्मिनल को Ctrl + D प्राप्त हुआ। यह कार्यक्रम में एक चरित्र नहीं भेजता है। क्या होता है कि जब प्रोग्राम टर्मिनल से पढ़ता है, तो टर्मिनल इसे "यह फ़ाइल का अंत है" बताता है, उसी तरह जब कोई प्रोग्राम डिस्क फ़ाइल के अंत के बाद पढ़ने की कोशिश करता है। शेल बिल्कुल भी शामिल नहीं है।
गाइल्स

23

आपका दूसरा बिंदु एक साथ दो पूरी तरह से अलग चीजें गांठ करता है।

आप बाद की तलाश में हैं।


7
यहां भ्रम के लिए संभावित: आवेदन के दृष्टिकोण से, कोई भी वास्तविक चरित्र ^ डी के लिए नहीं भेजा जाता है। जिसका अर्थ है कि आवेदन read(2)syscall से उस चरित्र को प्राप्त नहीं करता है ।
ulidtko
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.