में printf '%s\t%s\n' foo bar
, printf
आउटपुट करता है foo<TAB>bar<LF>
।
f
, o
, b
, a
और r
एकल-चौड़ाई चित्रमय अक्षर हैं।
उन वर्णों को प्राप्त करने पर, टर्मिनल एक समान ग्लिफ़ को प्रदर्शित करेगा और कर्सर को एक कॉलम को दाईं ओर ले जाएगा, जब तक कि यह स्क्रीन के दाहिने किनारे (मूल टेली-टाइपराइटर में कागज) तक नहीं पहुंच जाता है, जिस स्थिति में यह एक पंक्ति को खिला सकता है। और स्क्रीन के बाएं किनारे पर वापस जाएं (लपेटें) या टर्मिनल के आधार पर चरित्र को त्यागें और इसे कैसे कॉन्फ़िगर किया गया है।
<Tab>
और <LF>
दो नियंत्रण वर्ण हैं। <LF>
(उर्फ न्यूलाइन) यूनिक्स पाठ में लाइन सीमांकक है, लेकिन टर्मिनलों के लिए, यह सिर्फ एक पंक्ति को खिलाती है (कर्सर को एक स्थिति नीचे ले जाएं)। तो कर्नेल में टर्मिनल ड्राइवर वास्तव में इसे <CR>
(स्क्रीन के बाएं किनारे पर वापस), <LF>
(कर्सर नीचे) ( stty onlcr
आम तौर पर डिफ़ॉल्ट रूप से) में अनुवाद करेगा।
<Tab>
कर्सर को अगले टैब स्टॉप पर ले जाने के लिए कहता है (जो कि अधिकांश टर्मिनलों पर डिफ़ॉल्ट रूप से अलग-अलग 8 स्थिति हैं, लेकिन रिक्त स्थान को भरने के बिना) को कहीं भी सेट करने के लिए कॉन्फ़िगर किया जा सकता है।
इसलिए यदि उन वर्णों को टैब के साथ टर्मिनल पर भेजा जाता है, तो हर 8 कॉलम बंद हो जाते हैं, जबकि कर्सर एक खाली लाइन की शुरुआत में होता है, जिसके परिणामस्वरूप:
foo bar
उस लाइन पर स्क्रीन पर मुद्रित। यदि उन्हें भेज दिया जाता है जबकि कर्सर एक पंक्ति में तीसरे स्थान पर होता है xxxxyyyyzzzz
, जिसमें परिणाम होगा:
xxfooyyybarz
उन टर्मिनलों पर जो सारणीकरण का समर्थन नहीं करते हैं, टर्मिनल चालक को उन टैब को रिक्त स्थान के अनुक्रम में अनुवाद करने के लिए कॉन्फ़िगर किया जा सकता है। ( stty tab3
)।
मूल टेली-टाइपराइटर में SPC वर्ण, कर्सर को दाईं ओर \b
ले जाएगा , जबकि बैकस्पेस ( ) इसे बाईं ओर ले जाएगा। अब आधुनिक टर्मिनलों में, एसपीसी दाईं ओर ले जाता है और मिटा भी देता है (एक अंतरिक्ष चरित्र लिखता है जैसा कि आप उम्मीद करेंगे)। इसलिए लटकन को \b
ASCII की तुलना में कुछ नया होना चाहिए था। सबसे आधुनिक टर्मिनल पर, यह वास्तव में वर्णों का एक क्रम है: <Esc>
, [
, C
।
n
स्क्रीन पर किसी भी स्थिति में बाएं, दाएं, ऊपर, नीचे या किसी भी स्थान पर ले जाने के लिए अधिक एस्केप सीक्वेंस हैं। स्क्रीन के लाइनों या क्षेत्रों के हिस्सों (खाली करने के साथ भरने) के अन्य भागने के अनुक्रम हैं, आदि।
उन दृश्यों को आम तौर पर की तरह दृश्य अनुप्रयोगों के द्वारा उपयोग किया जाता है vi
, lynx
, mutt
, dialog
जहां पाठ स्क्रीन पर मनमाने ढंग से स्थानों पर लिखा है।
अब, सभी X11 टर्मिनल एमुलेटर और कुछ अन्य गैर- X11 जैसे GNU screen
आपको कॉपी पेस्ट के लिए स्क्रीन के क्षेत्रों का चयन करने देते हैं। जब आप vi
संपादक में जो कुछ भी देखते हैं उसका एक हिस्सा चुनते हैं , तो आप उस आउटपुट को उत्पन्न करने के लिए उपयोग किए गए सभी एस्केप अनुक्रमों को कॉपी नहीं करना चाहते हैं। आप अपने द्वारा देखे गए पाठ का चयन करना चाहते हैं।
उदाहरण के लिए यदि आप चलाते हैं:
printf 'abC\rAC\bB\t\e[C\b\bD\n'
कौन सा एक संपादक सत्र जहाँ आप में प्रवेश simulates abC
, शुरुआत के लिए वापस जाओ, की जगह ab
के साथ AC
, C
के साथ B
, अगले टैब स्टॉप के लिए, एक और स्तंभ सही करने के लिए, दो कॉलम बाईं ओर, चाल तो तो फिर enter D
।
आप समझ सकते हैं:
ABC D
वह है, ABC
एक 4 कॉलम गैप और D
।
यदि आप चयन करते हैं कि माउस के साथ xterm
या putty
, वे चयन में संग्रहीत करेंगे ABC
, 4 अंतरिक्ष वर्ण और D
, नहीं abC<CR>AC<BS>B<Tab><Esc>[C<BS><BS>D
।
चयन में जो समाप्त होता है वह printf
टर्मिनल चालक और टर्मिनल एमुलेटर दोनों द्वारा पोस्ट-प्रोसेस्ड द्वारा भेजा गया है।
अन्य प्रकार के परिवर्तन के लिए, <U+0065><U+0301>
( e
तीव्र उच्चारण के संयोजन के बाद) को <U+00E9>
( é
पूर्व-निर्मित रूप) से बदलकर देखें xterm
।
या echo abc
कि ABC
टर्मिनल ड्राइवर द्वारा अनूदित होने के बाद टर्मिनल पर भेजने से पहले समाप्त हो जाता है stty olcuc
।
अब, <Tab>
जैसे <LF>
कि उन कुछ नियंत्रण वर्णों में से एक है जो वास्तव में कभी-कभी पाठ फ़ाइलों ( <CR>
MSDOS पाठ फ़ाइलों में और कभी-कभी <FF>
पृष्ठ विराम के लिए भी) में पाए जाते हैं ।
तो कुछ टर्मिनल एमुलेटर कॉपी-पेस्ट बफ़र्स में उन्हें संरक्षित करने के लिए जब संभव हो तो उन्हें कॉपी करने का चयन करते हैं (यह आमतौर पर न तो मामला है <CR>
और न <LF>
ही)।
उदाहरण के लिए, VTE- आधारित टर्मिनलों में gnome-terminal
, आप देख सकते हैं कि, जब आप printf 'a\tb\n'
एक खाली लाइन पर आउटपुट का चयन करते हैं , तो gnome-terminal
वास्तव a\tb
में X11 चयन में a
7 रिक्त स्थान और के बजाय स्टोर होता है b
।
लेकिन के उत्पादन के लिए printf 'a\t\bb\n'
, यह भंडार a
, 6 रिक्त स्थान और b
, और के लिए printf 'a\r\tb\n'
, a
7 रिक्त स्थान और b
।
ऐसे अन्य मामले हैं जहां टर्मिनल वास्तविक इनपुट को कॉपी करने की कोशिश करेंगे, जैसे कि जब आप दौड़ने के बाद दो लाइनों का चयन करते हैं तो printf 'a \nb\n'
उस अदृश्य अनुगामी स्थान को संरक्षित किया जाएगा। या दो पंक्तियों का चयन करते समय एक LF वर्ण शामिल नहीं होता है जब दो पंक्तियों का परिणाम सही मार्जिन पर लपेटने से होता है।
अब, अगर आप printf
CLIPBOARD के आउटपुट को X11
सेलेक्ट करना चाहते हैं, तो सबसे अच्छा यह है कि आप इसे सीधे पसंद करें:
printf 'foo\tbar\n' | xclip -sel c
ध्यान दें कि जब आप उस xterm
या अधिकांश अन्य टर्मिनलों को पेस्ट करते हैं, तो xterm
वास्तव में वह बदल देता है क्योंकि इसके \n
साथ \r
ही वह चरित्र xterm
भेजता है जब आप दबाते हैं Enter(और टर्मिनल चालक इसे वापस अनुवाद कर सकता है \n
)।