2010-05-18 13 views
8

मुझे आश्चर्य है कि क्यों आम लिनक्स टर्मिनलों में बैकस्पेस चरित्र वास्तव में, वर्ण मिटा नहीं है जब मुद्रित (सामान्य रूप से जब आपके द्वारा लिखे गए काम करता है) ..बैकस्पेस चरित्र weirdness

यह अपेक्षा के अनुरूप काम करता है:

$ echo -e "abc\b\b\bxyz" 
xyz 

(\b बैकस्पेस को मूल्यांकन करता है, के रूप में Ctrl +वीCtrl भी डाला जा सकता है + एच -रूप में प्रदान की(0x08))

लेकिन जब वहाँ backspaces के बाद कम चरित्र, अजीब व्यवहार से पता चला है:

$ echo -e "abc\b\b\bx" 
xbc 

यह बैकस्पेस के बजाय छोड़ दिया तीर कुंजी की तरह बर्ताव:

$ echo -e "abc\e[D\e[D\e[Dx" 
xbc 

मिटा लाइन बैक सामान्य रूप से काम करता है:

$ echo -e "abc\e[1Kx" 
x 

वास्तव में , जब मैं Ctrl + वीबैकस्पेस टर्मिनल में टाइप ^? (0x7f) ^H के बजाय सामने आए है, इस डेल ASCII वर्ण, लेकिन Ctrl + वीडेल पैदा करता <ESC>[3~ है, लेकिन यह एक और कहानी है ..

तो क्या कोई यह समझा सकता है कि क्यों मुद्रित बैकस्पेस वर्ण वर्णों को मिटा नहीं देता है?

उत्तर

16

क्या आप देख रहे हैं सही है (मेरे पर्यावरण टर्म लिनक्स और कुछ अन्य टर्मिनल emulators है, $TERM == xterm, vt100, Linux रूप में अच्छी तरह की कोशिश की)। बैकस्पेस या ^H कर्सर को बाईं ओर ले जाता है, कोई मिटा नहीं देता है। किसी चरित्र को मिटाने के लिए, आपको ^H ^H (बैकस्पेस-स्पेस-बैकस्पेस) आउटपुट करने की आवश्यकता है।


अपनी टिप्पणी का उत्तर देने के - बैकस्पेस टर्मिनलों के VT100/एएनएसआई परिवार, जिसमें से टर्मिनल नियंत्रण कोड दृश्यों का एक बहुत उधार में उस तरह से परिभाषित किया गया है। VT100 उपयोगकर्ता मैनुअल here देखें जो बीएस के कार्य को परिभाषित करता है "कर्सर को बाईं ओर एक वर्ण स्थिति में ले जाता है, जब तक कि यह बाएं हाशिए पर न हो, जिसमें कोई कार्रवाई नहीं होती है"। दूसरे शब्दों में यह इतिहास का एक कर्कश है :)

यह क्यों शुरू में इस तरह से परिभाषित किया गया था - मुझे लगता है कि यह एक विनाशकारी कर्सर आंदोलन नियंत्रण कोड के लिए अधिक लचीला है, क्योंकि ऊपर दिखाए गए विनाशकारी बैकस्पेस को लागू किया जा सकता है।

+0

अच्छी तरह से, यह एक स्पष्टीकरण नहीं है _why_ बैकस्पेस नियंत्रण चरित्र बाएं कर्सर कुंजी की तरह व्यवहार करता है, कॉमन्स अर्थ के अनुसार नहीं (अंतिम चरित्र मिटाएं) – mykhal

+0

अब मैं संतुष्ट हूं, spec लिंक के लिए धन्यवाद :) – mykhal

+7

वास्तविक कारण यह काम करता है इस तरह से पुरानी, ​​"हार्ड कॉपी" टर्मिनलों की वजह से एक टाइपराइटर की तरह पेपर पर प्रिंट किया जाता है।इस तरह के एक टर्मिनल पर आउटपुट होने के बाद एक चरित्र को मिटाने का कोई तरीका नहीं है। टाइपराइटर-जैसे टर्मिनल भी कारण हैं कि हम अभी भी विंडोज़ पर लाइनों को समाप्त करने के लिए अलग "कैरिज रिटर्न" और "लाइन फीड" वर्णों से फंस गए हैं। – alexis