CTRL + C के बाद कंसोल को कभी-कभी रीसेट की आवश्यकता क्यों होती है


9

कुछ कमांड लाइन इंटरफ़ेस टूल द्वारा रद्द किए जाने पर टूटे हुए कंसोल को वापस करते हैं CTRL+C। कभी-कभी पाठ अदृश्य होता है, या जब तक मैं कमांड नहीं चलाता, ग्राफिक समस्याएं हैं reset

(मैं बैश का उपयोग करता हूं, लेकिन उम्मीद करता हूं कि यह शेल से स्वतंत्र है।)

क्या इस प्रभाव का कोई नाम है? इसका क्या कारण है, और प्रोग्रामर इसे टूल में कैसे रोक सकते हैं? क्या कोई रणनीति है कि प्रमुख प्रोग्रामिंग भाषाओं में इस समस्या को कैसे संबोधित किया जाए?



stty saneग्रे दाढ़ी के लिए
Thorbjørn रावन एंडरसन

जवाबों:


14

एक कंसोल को कभी-कभी एक reset(1) (या कुछ stty(1)कमांड) की आवश्यकता होती है क्योंकि कुछ प्रक्रिया (उदाहरण के लिए आपके शेल द्वारा शुरू किया गया कार्यक्रम) समाप्त होने पर एक छद्म टर्मिनल की स्थिति नहीं बदलती है।

टट्टी ध्वस्त पढ़ें ।

(मुझे लिनक्स के सबसे कठिन हिस्से में छद्म-टर्मिनलों और स्यूडोट्टी के हैंडलिंग का पता चलता है)

क्या कोई रणनीति है कि प्रमुख प्रोग्रामिंग भाषाओं में इस समस्या को कैसे संबोधित किया जाए?

टर्मिनल से निपटने और इसके मोड या लाइन अनुशासन को बदलने के लिए एक अच्छी तरह से व्यवहार किए गए कार्यक्रम को क्रैश से बचने और उचित कॉल ( टर्मिनल देखें (3) देखें ) को सही स्थिति में लाने के लिए कड़ी मेहनत करनी चाहिए । BTW, लाइब्रेरी जैसे ncurses या रीडलाइन मददगार हैं (लेकिन आपको उचित तरीके से उनकी सफाई रूटीन को कॉल करने की आवश्यकता है)।

देखें संकेत (7) और संकेत सुरक्षा (7) । अपने कोड में दुर्घटनाग्रस्त होने से बचना मुश्किल है। अपरिभाषित व्यवहार के बारे में पढ़ें ।

अपूर्ण वर्कअराउंड एक शेल फ़ंक्शन को परिभाषित करने के लिए हो सकता है जो आपके प्रोग्राम को चलाता है reset( फिर कभी-कभी अनुचित हो सकता है)।


यह बढ़िया नहीं है; कभी-कभी मूल लोगों से resetअलग sttyसेटिंग्स हो सकती हैं।
बॉब

हाँ, यह इंगित करने के लिए धन्यवाद। मैंने "अपूर्ण" जोड़ा।
बेसिल स्टायरनेविच

मैंने आपके लिंक पढ़े हैं, वे दिलचस्प थे, लेकिन यह सहायक होगा, यदि आप इस क्यू / प्रत्येक के लिए एक अनुभाग में एक संकेतक जोड़ सकते हैं। टटी को पढ़ने के बाद, मैं stty -a > /tmp/test1तब एक कमांड में बैश में शुरू हुआ, जिसे मैंने रद्द कर दिया। टर्मिनल का रंग अब लाल हो गया था। stty -a > /tmp/test2लेकिन test1और test2बिल्कुल वैसा ही था।
जोनास स्टीन

1

इस समस्या पर प्रतिक्रिया पूरी तरह से स्वतंत्र नहीं है। Zsh में, बिल्टिन है, ttyctlजो टैटी मोड को "फ्रीज" या "अनफ्रीज" कर सकता है। मुझे नहीं लगता कि बैश में कोई समान है। settyTcsh में आदेश एक ही बात करता है, लेकिन अधिक परिष्कृत: आप अलग-अलग सेटिंग रोक सकते हैं।

टैटी मोड को फ्रीज करने का मतलब है कि zsh को वर्तमान मोड याद होगा, और अगर कुछ भविष्य के बच्चे इसे बदलते हैं, तो बच्चे को निलंबित या समाप्त होने पर मोड को बहाल किया जाएगा।

यह आपको उन कार्यक्रमों के कुछ बुरे प्रभावों से बचाएगा जो दुर्घटनाग्रस्त हो जाते हैं या अन्यथा टर्मिनल को साफ करने में विफल रहते हैं। यदि आप के साथ एक बदलाव करना चाहते हैं, तो आपको याद रखना चाहिए stty, अन्यथा शेल आपके द्वारा sttyकिए गए कार्यों को तुरंत पूर्ववत कर देगा ।

resetsttyमोड को पुनर्स्थापित करने से अधिक है , इसलिए आपको अभी भी कभी-कभी इसकी आवश्यकता हो सकती है, लेकिन अक्सर नहीं।


वास्तव में: मैंने bash में stty -a> / tmp / test1 शुरू किया, फिर एक कमांड, जिसे मैंने रद्द कर दिया। टर्मिनल का रंग अब लाल हो गया था। stty -a> / tmp / test2 लेकिन test1 और test2 बिल्कुल समान थे। मैंने tcsh के साथ भी यही कोशिश की थी, लेकिन मैं CTRL + C द्वारा अपनी कमांड को क्रैश नहीं कर सका। रंग ठीक रहे।
जोनास स्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.