जब आप दबाते हैं Ctrl+X, तो आपका टर्मिनल एमुलेटर छद्म-टर्मिनल जोड़ी के मास्टर पक्ष को बाइट 0x18 लिखता है।
आगे क्या होता है यह इस बात पर निर्भर करता है कि tty लाइन अनुशासन (कर्नेल में मास्टर मॉड्यूल (एमुलेटर के नियंत्रण में) और दास पक्ष (जो टर्मिनल में चलने वाले एप्लिकेशन के साथ बातचीत करता है) के बीच बैठता है) कैसे कॉन्फ़िगर किया गया है।
कि कॉन्फ़िगर करने के लिए एक कमांड tty लाइन अनुशासन है stty
आदेश।
जब एक गूंगा एप्लिकेशन को चलाने के cat
बारे में पता नहीं होता है और यह परवाह नहीं करता है कि इसकी स्टड टर्मिनल है या नहीं, टर्मिनल एक डिफ़ॉल्ट विहित मोड में है जहां ट्टी लाइन अनुशासन एक क्रूड लाइन संपादक को लागू करता है ।
कुछ इंटरेक्टिव एप्लिकेशन जिन्हें उस क्रूड लाइन एडिटर से अधिक की आवश्यकता होती है, आमतौर पर उन सेटिंग्स को स्टार्ट-अप पर बदलते हैं और उन्हें छोड़ने पर पुनर्स्थापित करते हैं। आधुनिक गोले, उनके संकेत पर ऐसे अनुप्रयोगों के उदाहरण हैं। वे अपने स्वयं के अधिक उन्नत लाइन संपादक को लागू करते हैं।
आमतौर पर, जब आप एक कमांड लाइन में प्रवेश करते हैं, तो शेल उस मोड में tty लाइन अनुशासन डालता है, और जब आप वर्तमान कमांड को चलाने के लिए एंटर दबाते हैं, तो शेल सामान्य tty मोड को पुनर्स्थापित करता है (जैसा कि प्रॉम्प्ट जारी करने से पहले प्रभाव में था)।
यदि आप stty -a
कमांड चलाते हैं , तो आपको डंब एप्लिकेशन के लिए वर्तमान सेटिंग दिखाई देगी । आप द्वारा देखे जाने वाले icanon
, echo
और echoctl
सेटिंग्स सक्षम जा रहा है।
इसका मतलब यह है कि:
icanon
: वह क्रूड लाइन संपादक सक्षम है।
echo
: आपके द्वारा लिखे गए वर्ण (जो कि टर्मिनल एमुलेटर मास्टर साइड को लिखते हैं) वापस गूँजते हैं (टर्मिनल एमुलेटर द्वारा पढ़ने के लिए उपलब्ध किए जाते हैं )।
echoctl
: किया जा रहा करने के बजाय गूँजती असीस, नियंत्रण वर्ण रहे गूँजती के रूप में ^X
।
तो, चलिए आपको टाइप करते हैं A B Backspace-aka-Ctrl+H/? C Ctrl+X Backspace Return।
आपका टर्मिनल एमुलेटर भेजेगा AB\bC\x18\b\r
:। लाइन अनुशासन वापस गूंज जाएगा: AB\b \bC^X\b \b\b \b\r\n
और एक आवेदन जो दास पक्ष से इनपुट पढ़ता है ( /dev/pts/x
) पढ़ेगा AC\n
।
सभी एप्लिकेशन देखता है AC\n
, और केवल जब आपका प्रेस Enterतो यह ^X
वहाँ के लिए उत्पादन पर कोई नियंत्रण नहीं हो सकता है ।
आप देखेंगे कि इको के लिए , पहले ^H
( ^?
कुछ टर्मिनलों के साथ, erase
सेटिंग देखें ) \b \b
टर्मिनल पर वापस भेजे जाने के परिणामस्वरूप । यही कारण है कि कर्सर वापस, इस कदम कर्सर वापस फिर से ले जाने के स्थान के साथ अधिलेखित, जबकि दूसरा अनुक्रम है ^H
के परिणामस्वरूप \b \b\b \b
उन दो को मिटाने के लिए ^
और X
अक्षर।
^X
(0x18) खुद में अनुवाद किया जा रहा था ^
और X
उत्पादन के लिए। जैसे B
, हमने इसे एप्लिकेशन पर लागू नहीं किया, क्योंकि हमने इसे बैकस्पेस के साथ हटा दिया था।
\r
(उर्फ ^M
) को प्रतिध्वनि के लिए \r\n
( ^M^J
) और \n
( ^J
) के लिए अनुवाद किया गया था ।
तो, उन गूंगे अनुप्रयोगों के लिए हमारे विकल्प क्या हैं :
- अक्षम
echo
( stty -echo
)। यह प्रभावी रूप से नियंत्रण के तरीके को बदल देता है, जिससे गूंज उठता है ... कुछ भी नहीं गूंज रहा है। वास्तव में समाधान नहीं।
- अक्षम करें
echoctl
। इससे वर्णों को नियंत्रित करने का तरीका बदल जाता है ( ... के अलावा ^H
, ^M
और लाइन संपादक द्वारा उपयोग किए गए अन्य सभी) गूँजते हैं। वे तब के रूप में गूँज रहे हैं । उदाहरण के लिए, ESC वर्ण को \e
( ^[
/ 0x1b
) बाइट के रूप में भेजा जाता है ( जिसे टर्मिनल द्वारा भागने के क्रम की शुरुआत के रूप में पहचाना जाता है), ^G
आप एक \a
(एक बीईएल, अपना टर्मिनल बीप बनाते हुए ) भेजते हैं ... विकल्प नहीं ।
- क्रूड लाइन संपादक को अक्षम करें (
stty -icanon
)। वास्तव में एक विकल्प नहीं है क्योंकि क्रूड एप्लिकेशन बहुत कम उपयोग योग्य बनेंगे।
- टैटी लाइन अनुशासन के व्यवहार को बदलने के लिए कर्नेल कोड को संपादित करें ताकि नियंत्रण वर्ण की प्रतिध्वनि
\e[7m^X\e[m
सिर्फ बदले में भेजे ^X
(यहां \e[7m
आमतौर पर अधिकांश टर्मिनलों में रिवर्स वीडियो सक्षम करता है)।
एक विकल्प रैपर का उपयोग करने के लिए हो सकता है जैसे rlwrap
कि डंबल एप्लिकेशन को डंबल लाइन एडिटर जोड़ने के लिए एक गंदा हैक है। प्रभाव में आने वाला रैपर read()
टर्मिनल डिवाइस से रीडलाइन लाइन एडिटर को कॉल करने के लिए सरल एस को बदलने की कोशिश करता है (जो टेट लाइन अनुशासन के मोड को बदलते हैं)।
आगे भी, आप इस तरह के समाधानों की कोशिश कर सकते हैं जो ^X
जीएनयू स्क्रीन की :exec
सुविधा पर भरोसा करते हुए, zsh के लाइन एडिटर (जो रिवर्स वीडियो में हाइलाइटिंग के लिए होता है ) के माध्यम से टर्मिनल से सभी इनपुट को हाईजैक करता है ।
अब उन अनुप्रयोगों के लिए जो अपने स्वयं के लाइन संपादक को लागू करते हैं, यह उन पर निर्भर करता है कि प्रतिध्वनि कैसे की जाती है। bash
इसके लिए रीडलाइन का उपयोग करता है, जिसमें यह नियंत्रित करने के लिए कोई समर्थन नहीं है कि नियंत्रण वर्ण कैसे प्रतिध्वनित होते हैं।
के लिए zsh
, देखें:
info --index-search='highlighting, special characters' zsh
zsh
डिफ़ॉल्ट रूप से गैर-मुद्रण योग्य वर्णों को उजागर करता है। आप उदाहरण के लिए हाइलाइटिंग को कस्टमाइज़ कर सकते हैं:
zle_highlight=(special:fg=white,bg=red)
उन विशेष पात्रों के लिए लाल हाइलाइटिंग पर सफेद के लिए।
उन पात्रों का पाठ प्रतिनिधित्व हालांकि अनुकूलन योग्य नहीं है।
एक UTF-8 लोकेल में, 0x18 के रूप में प्रदान किया जाएगा ^X
, \u378
, \U7fffffff
(दो असाइन नहीं किए गए यूनिकोड कोड अंक) के रूप में <0378>
, <7FFFFFFF>
, \u200b
के रूप में (एक नहीं वास्तव में प्रिंट करने योग्य यूनिकोड चरित्र) <200B>
।
\x80
एक iso8859-1 लोकेल में प्रस्तुत किया जाएगा ^�
... आदि।
bash
यहreadline
उस सामान को संभाल रहा है, और अधिकांश लोगों के लिए यह ट्टी ड्राइवर है।