क्या कोई कारण है कि मुझे ^ [[ए जब मैं कंसोल लॉगिन स्क्रीन पर तीर दबाता हूं?


32

जब भी मैं कंसोल लॉगिन पर होता हूं, मैं upपहले से टाइप किए गए कमांड्स को देखने के लिए जानबूझकर तीर दबाता हूं । लेकिन मैं यह देखता हूं ^[[A

लेकिन जब मैं Ctrl Alt Print Screen Scroll Lock Pause Break Page Up Page Down Winकुंजी दबाता हूं तो कोई भी पात्र गूंजता नहीं है।

इसके पीछे क्या कारण हो सकता है?

क्या ^[[Aपात्रों की तरह कुछ भी करता है?

यहाँ छवि विवरण दर्ज करें

जवाबों:


20

यही तरीका है कि टर्मिनल कीबोर्ड द्वारा भेजे गए कुंजी के कच्चे कीकोड का प्रतिनिधित्व करता है। असल में, आपका शेल आमतौर पर कीप को इंटरसेप्ट करेगा, लेकिन लॉगिन प्रॉम्प्ट पर ऐसा करने के लिए कुछ नहीं है। तो आपके द्वारा टाइप किया गया चरित्र किसी अन्य अक्षर (या संख्या, या जो भी) की तरह कंसोल पर प्रिंट हो जाता है।


3
@RubanSavvy Ctrl, Alt और Win (अक्सर GNU / Linux की दुनिया में सुपर कहा जाता है) संशोधक हैं। यदि आप उन्हें और एक कुंजी दबाते हैं, तो आप स्क्रीन पर मुद्रित कुछ अलग देखेंगे। स्क्रॉल लॉक मुझे संदेह है कि इसकी व्याख्या कर्नेल या कुछ और निम्न स्तर पर है, tty नियंत्रण के लिए, हालांकि मुझे यकीन नहीं है। पृष्ठ ऊपर और नीचे शायद द्वारा निगल लिया gettyया login, हालांकि मुझे यकीन है कि क्यों नहीं कर रहा हूँ। शिक्षित अनुमान यह कहता है कि ऐतिहासिक कारणों से प्रिंट स्क्रीन की व्याख्या विशेष रूप से कर्नेल द्वारा की जाती है। मैं 100% यकीन नहीं कर रहा हूँ, हालांकि, संशोधक को छोड़कर।
स्ट्रॉन्ग

3
ऊपर शायद जवाब में संपादित किया जाना चाहिए।
स्ट्रॉन्ग

चैट में संबंधित चर्चा: chat.stackexchange.com/transcript/message/12481097#12481097
strugee

19

कीबोर्ड कंप्यूटर को ईवेंट भेजते हैं। एक घटना कहती है "स्कैन कोड nnn डाउन" या "स्कैन कोड nnn अप"। श्रृंखला के दूसरे छोर पर, टर्मिनल में चल रहे एप्लिकेशन वर्णों के अनुक्रम के रूप में इनपुट की अपेक्षा करते हैं। (जब तक कि वे एक्स सर्वर की तरह कच्ची पहुंच का अनुरोध नहीं करते।) जब आप दबाते हैं A, तो कीबोर्ड "स्कैन कोड 38 डाउन" की जानकारी भेजता है। कंसोल ड्राइवर अपने कीमैप को देखता है और इसे "वर्ण a" (यदि कोई संशोधक कुंजी नहीं दबाया जाता है) में बदल देता है।

जब आप किसी कुंजी या कुंजी संयोजन को दबाते हैं, जिसके परिणामस्वरूप वर्ण नहीं होता है, तो जानकारी को वर्णों के संदर्भ में एन्कोड किया जाना चाहिए। कुछ कुंजियों और कुंजी संयोजनों में संबंधित नियंत्रण वर्ण होते हैं, जैसे Ctrl+ Aवर्ण (बाइट मान 1) Returnभेजता है, वर्ण भेजता है (Ctrl + M, बाइट मान 13), आदि। अधिकांश फ़ंक्शन कुंजियों में संबंधित वर्ण नहीं होता है और इसके बजाय भेजते हैं। वर्णों का एक क्रम जो (बच, बाइट मान 27) वर्ण से शुरू होता है । उदाहरण के लिए, कुंजी Upको एस्केप सीक्वेंस ␛[A(तीन वर्ण: एस्केप, ओपन ब्रैकेट, कैपिटल ए) में अनुवादित किया गया है ।

कंसोल पर उपयोगकर्ता नाम संकेत गूंगा है और अधिकांश एस्केप दृश्यों को नहीं समझता है। इसमें आपके द्वारा उपयोग किए जाने वाले लाइन संस्करण और इतिहास सुविधाएँ नहीं हैं: जिन्हें शेल द्वारा प्रदान किया गया है, और जब तक आप लॉग इन नहीं करते, आपके पास शेल नहीं है। तो यह बस एस्केप सीक्वेंस प्रदर्शित करता है। चरित्र के लिए कोई ग्लिफ़ नहीं है , इसलिए इसे प्रदर्शित किया जाता है ^[। इस ^चिन्ह का उपयोग पारंपरिक रूप से नियंत्रण वर्णों के लिए उपसर्ग के रूप में किया जाता है, और ^[इसके बाइट मूल्य के कारण पलायन होता है : यह बाइट मान [, माइनस 64 है।

यदि आप Upएक शेल प्रॉम्प्ट पर दबाते हैं , तो यह आपके शेल में समान 3-वर्ण अनुक्रम भेजता है। शेल इसे एक कमांड अनुक्रम (आमतौर पर पिछले इतिहास आइटम को याद करने के लिए) के रूप में व्याख्या करता है। यदि आप एक प्रेस प्रॉम्प्ट पर Ctrl+ दबाते हैं , Vतो Upयह प्रॉम्प्ट पर एस्केप सीक्वेंस डालता है: Ctrl+ Vकमांड को कमांड के रूप में व्याख्या करने के बजाय अगले वर्ण को शाब्दिक रूप से सम्मिलित करने के लिए एक कमांड है, इसलिए कैरेक्टर को एस्केप सीक्वेंस की शुरुआत के रूप में नहीं समझा जाता है। ।

कुछ चाबियाँ केवल संशोधक हैं और टर्मिनल अनुप्रयोगों में प्रेषित नहीं की जाती हैं। उदाहरण के लिए, जब आप दबाते हैं Shift, तो यह जानकारी टर्मिनल ड्राइवर में रहती है, और इसे ध्यान में रखा जाता है यदि आप दबाते हैं A, तो ड्राइवर Aइसके बजाय एप्लिकेशन को भेजता है a

इसके अतिरिक्त कुछ फ़ंक्शन कुंजियाँ आपके कंसोल में मैप नहीं की जा सकती हैं।

GUI में समान दृश्य के लिए, देखें कि bash की मेटा कुंजी क्या है?


यह एक महान जवाब है, हमेशा की तरह धन्यवाद गिल्स।
जोशुआली

5

यह नहीं है कि "टर्मिनल" (यानी, टर्मिनल एमुलेटर एप्लिकेशन) द्वारा कुंजियों का प्रतिनिधित्व कैसे किया जाता है। आप जो देख रहे हैं, वह एक पंक्ति ऊपर की ओर बढ़ने के लिए ANSI कोड ( ANSI एस्केप अनुक्रम ) है, लेकिन प्रिंट करने योग्य रूप में अनुवादित है।

  1. कीबोर्ड हार्डवेयर "स्कैन कोड" भेजता है, लेकिन वे अनुवाद किए जाते हैं और कमांडलाइन स्तर के अनुप्रयोगों को पात्रों के रूप में प्रस्तुत किए जाते हैं। कुंजी Aएकल बाइट बन जाती है: Aयदि Shift कुंजी नीचे है (या Shift Lock), aअन्यथा।

  2. एक एएनएसआई-अनुरूप टर्मिनल में, तीर कुंजियाँ एक वर्ण नहीं भेजती हैं (ASCII वर्ण सेट में तीर के लिए कोई कोड नहीं हैं), लेकिन एक 3-चरित्र "एस्केप अनुक्रम" escape-[-A:। अन्य तीन तीर कुंजी हैं escape-[-B, C, D

  3. एक ही वर्ण अनुक्रम कर्सर को एक पंक्ति तक ले जाएगा यदि एक पुराने भौतिक एएनएसआई टर्मिनल के लिए (गूंज) भेजा जाता है। टर्मिनल एमुलेटर सहित कई कार्यक्रम, इन वर्ण अनुक्रमों को पहचानते हैं और कुछ उपयुक्त करते हैं: टर्मिनल एमुलेटर कर्सर को ऊपर ले जाएगा (यह है कि कैसे cursesपुस्तकालय कर्सर को चारों ओर ले जाता है), लेकिन bashइसे इंटरसेप्ट करेगा और इसके बजाय इतिहास को स्क्रॉल करेगा।

  4. कर्सर को उन कार्यक्रमों में सभी जगह खत्म होने से बचाने के लिए जिनका स्क्रीन के चारों ओर कर्सर ले जाने का कोई उपयोग नहीं है, आप अक्सर कीबोर्ड इनपुट में ईएससी को प्रिंट करने योग्य अनुक्रम के रूप में प्रदर्शित करते देखेंगे ^[(क्योंकि भागने से मेल खाती है control-[)। यह वास्तव में टर्मिनल डिवाइस इंटरफ़ेस द्वारा नियंत्रित किया जाता है; देखते हैं stty(1)। नतीजतन, ऊपर तीर के रूप में दिखाई देगा ^[[A। कमांड लाइन से आप इसे देखेंगे यदि आप टाइप करते हैं cat, रिटर्न हिट करते हैं, और कुछ तीर कुंजी दबाते हैं। यह भी आपने कंसोल लॉगिन स्क्रीन पर देखा था।

अंत में: Control, Alt, और अन्य चाबियाँ आप चरित्र दृश्यों से मैप नहीं उल्लेख किया है। वे किसी अन्य कुंजी द्वारा भेजे गए वर्ण को प्रभावित करते हैं (जैसे a/ Aऊपर का उदाहरण), या उनके पास केवल पाठ के लिए कोई मैपिंग नहीं है। इस तरह के कीप को केवल उन कार्यक्रमों द्वारा पता लगाया जा सकता है जो कीबोर्ड ईवेंट के लिए सुनते हैं। उन्हें मानक इनपुट से पढ़कर नहीं देखा जा सकता है (या फ़ाइल में लिखा जा सकता है)।


3

यह बर्ताव शेल से शेल तक अलग है। अधिकांश गोले readlineप्रॉम्प्ट में लाइनों को संपादित करने के लिए एक पुस्तकालय का उपयोग करते हैं । यहां इस लाइब्रेरी के लिए एक संपूर्ण कमांड संदर्भ है, इसलिए जब कोई एप्लिकेशन उपयोग कर रहा है readlineतो आप इस कमांड के साथ लाइनों को संपादित और नेविगेट कर सकते हैं।

ऊर्ध्वाधर तीर कुंजी कमांड इतिहास को नेविगेट करने के लिए रीडलाइन में कॉन्फ़िगर की गई हैं। और लॉगिन प्रॉम में कोई कमांड इतिहास नहीं है। यही कारण है कि अक्षर ^[[Aऔर ^[[Bस्क्रीन पर मुद्रित होते हैं। तो क्या ^[[Aमतलब है?

Bash का मैनुअल पृष्ठ इसके अंतर्गत कहता है PROMPTING:

\[     begin a sequence of non-printing characters, which could be used to embed
       a terminal control sequence into the prompt

भागने दृश्यों एएनएसआई में तीर कुंजी के लिए कर रहे हैं:

  • [ValueAऊपर कर्सर (जहां Valueemtpy हो सकता है)

  • [ValueBनीचे कर्सर (जहां Valueemtpy हो सकता है)


5
आपका उत्तर अलग चीज के बारे में है, क्योंकि लॉगिन प्रॉम्प्ट मुद्रित और नियंत्रित होता है login, जो संबंधित नहीं है bash
रिस्तो सलमिनन

1
bashऔर loginलाइनों को संपादित करने के लिए एक ही पुस्तकालय (रीडलाइन) का उपयोग कर रहे हैं। अंतर सिर्फ इतना है कि loginवर्टिकल एरो कीज़ को कमांड के रूप में इंटरप्रिटेट न करें, जैसे कि bashकरता है।
अव्यवस्था

हां, मैं मानता हूं कि।
रिस्तो सलमिनन

बैश सिंटैक्स का ^[प्रतिनिधित्व करने की तरह दिखता है escape, लेकिन वे अलग चीजें हैं। बैश किसी भी वाक्यविन्यास का उपयोग कर सकता था। वास्तव में, जब आप लिखते हैं \[A, तो तीन वर्णों को बैश करता है: ^[(यानी बच) [,, A
एलेक्सिस

0

वे ANSI एस्केप कोड हैं^[एक ESCबाइट (ASCII बाइट 27) प्रदर्शित करने के लिए आपके शेल का उपयोग करता है । तो आपका उदाहरण पाठ के बाद ईएससी बाइट है [A। जैसा कि आप विकिपीडिया लेख में देख सकते हैं, ^[[( ESCइसके बाद [) एक नियंत्रण अनुक्रम परिचयकर्ता या सीएसआई है। CSI Aइसका मतलब है कि कर्सर को एक कॉलम से ऊपर ले जाएं।

यदि आप टर्मिनल में एक एस्केप कोड देखना चाहते हैं, तो CTRL + V टाइप करें और फिर एक अन्य महत्वपूर्ण अनुक्रम। उदाहरण के लिए, CTRL + V अप एरो शो के बाद ^[[A


0

कमांड शेल, उदाहरण के लिए बैश एक प्रोग्राम है जो एक्शन में एरो ट्रांसलेट करता है "पिछले कमांड को पुनः प्राप्त"। आपके पास कमांड शेल नहीं है।


0

TLDR

shजब आप अप एरो की दबाते हैं तो संभवत: आप कच्चे कीकोड को जेनरेट करते हैं।

एक और अधिक उन्नत शेल bashइन कीकोड को स्वीकार करता है और उनके साथ कुछ करता है। उदाहरण के लिए अपने इतिहास में अंतिम आदेश दिखाओ।

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