कैसे स्पष्ट आदेश काम करता है?


33

मैं हाल ही में यह जानने की कोशिश कर रहा था कि शेल कैसे काम करता है और यह देख रहा है कि clearकमांड कैसे काम करता है। निष्पादन योग्य में स्थित है /usr/bin/clearऔर यह रिक्त लाइनों (टर्मिनल की ऊंचाई के बराबर) का एक गुच्छा प्रिंट करने के लिए लगता है और टर्मिनल के शीर्ष-बाईं ओर कर्सर डालता है।

टर्मिनल के आकार की परवाह किए बिना, कमांड का आउटपुट हमेशा समान होता है:

$ clear | hexdump -C
00000000  1b 5b 48 1b 5b 32 4a                              |.[H.[2J|
00000007

और एक ही प्रभाव वाले गूंज के साथ दोहराया जा सकता है:

$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"

मैं वास्तव में उत्सुक था कि इस कमांड का आउटपुट कंसोल को क्लियर करने के लिए कैसे अनुवाद करता है।


Ctrl + एल - देखो परstty -a
mikeserv

जवाबों:


26

clearकमांड का आउटपुट कंसोल एस्केप कोड है। आवश्यक सटीक कोड आपके द्वारा उपयोग किए जा रहे सटीक टर्मिनल पर निर्भर करते हैं, हालांकि अधिकांश एएनएसआई नियंत्रण अनुक्रमों का उपयोग करते हैं। यहाँ विभिन्न कोड्स को समझाते हुए एक अच्छा लिंक दिया गया है - http://www.termsys.demon.co.uk/vtansi.htm । प्रासंगिक स्निपेट निम्न हैं:

Cursor Home         <ESC>[{ROW};{COLUMN}H

Sets the cursor position where subsequent text will begin. If no row/column
parameters are provided (ie. <ESC>[H), the cursor will move to the home position,
at the upper left of the screen.

तथा:

Erase Screen        <ESC>[2J

Erases the screen with the background colour and moves the cursor to home.

<ESC>हेक्स 1Bया ऑक्टल कहाँ है 033। पात्रों को देखने का एक और तरीका है:

clear | sed -n l

18

यह कुछ ANSI एस्केप सीक्वेंस जारी करके काम करता है । विशेष रूप से, ये दो:

Esc [Line; ColumnH Cursor स्थिति:
Esc [Line; Columnf कर्सर को निर्दिष्ट स्थिति (निर्देशांक) में ले जाता है। यदि आप
                                         एक स्थिति निर्दिष्ट नहीं करते हैं, तो कर्सर
                                         स्क्रीन के ऊपरी-बाएँ कोने में घर की स्थिति में जाता है (पंक्ति 0, स्तंभ 0)।

Esc [2J मिटा प्रदर्शित करें:
                                         स्क्रीन को साफ़ करता है और कर्सर को घर की स्थिति में ले जाता है
                                         (पंक्ति 0, कॉलम 0)।

इस के उत्पादन में समझना शायद आसान है od -c:

$ clear | od -c
0000000 033   [   H 033   [   2   J
0000007

033है Esc, इसलिए ऊपर का उत्पादन केवल Esc[Hऔर फिर है Esc[2J


9

स्पष्ट (1) द्वारा भेजा गया उत्पादन आपके टर्मिनल प्रकार पर निर्भर करता है, जो शेल वातावरण में $ TERM द्वारा परिभाषित किया गया है। यह कमांड "tput clear" के रूप में एक ही काम करता है, जो वर्तमान टर्मिनल प्रकार के लिए एस्केप कोड को देख रहा है और उस स्ट्रिंग को मानक आउटपुट पर भेज रहा है।

क्लियर / टुट से एस्केप कोड प्राप्त करने वाला टर्मिनल इसकी व्याख्या करता है और भेजे गए कमांड को निष्पादित करता है, जैसे कि स्थानीय डिस्प्ले को क्लीयर करना। "टर्मिनल" का अर्थ है स्थानीय कंसोल या टर्मिनल सत्र (पोटीन, एक्सटर्म, आदि), संभवतः ssh या टेलनेट के माध्यम से।


7

मुझे आश्चर्य है कि अन्य जवाबों ने TERMINFO (या TERMCAP) का उल्लेख नहीं किया है

ल्यूक आदमी पृष्ठों का उपयोग करें

man clear कहते हैं ...

NAME
       clear - clear the terminal screen

SYNOPSIS
       clear

DESCRIPTION
       clear clears your screen if this is possible.  It looks in the environ-
       ment for the terminal type and then in the terminfo database to  figure
       out how to clear the screen.

सावधि

clearआदेश केवल का उपयोग करता है एएनएसआई बच दृश्यों अपने अगर $TERMएएनएसआई या कुछ एएनएसआई आधारित टर्मिनल टर्म के रूप में इस प्रकार के लिए निर्धारित है।

$ TERM=ansi clear | hexdump -C
00000000  1b 5b 48 1b 5b 4a                                 |.[H.[J|
00000006

$ TERM=wy50 clear | hexdump -C
00000000  1b 2b                                             |.+|
00000002

$ TERM=hurd clear | hexdump -C
00000000  1b 63                                             |.c|
00000002

$ TERM=glasstty clear | hexdump -C
00000000  0c                                                |.|
00000001

$ TERM=vt52 clear | hexdump -C
00000000  1b 48 1b 4a                                       |.H.J|
00000004

$ TERM=hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009

INFOCMP

आप infocmpजांच करने के लिए उपयोग कर सकते हैं

$ infocmp -L -1 hpterm | grep clear_screen
        clear_screen=\E&a0y0C\EJ,

TPUT

या आप tputएक क्षमता देखने के लिए उपयोग कर सकते हैं

$ tput -T hpterm clear | hexdump -C
00000000  1b 26 61 30 79 30 43 1b  4a                       |.&a0y0C.J|
00000009


$ tput -T hpterm reset | hexdump -C
00000000  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000010  20 20 1b 31 20 20 20 20  20 20 20 20 1b 31 20 20  |  .1        .1  |
00000020  20 20 20 20 20 20 1b 31  20 20 20 20 20 20 20 20  |      .1        |
00000030  1b 31 20 20 20 20 20 20  20 20 1b 31 20 20 20 20  |.1        .1    |
00000040  20 20 20 20 1b 31 20 20  20 20 20 20 20 20 1b 31  |    .1        .1|
00000050  20 20 20 20 20 20 20 20  1b 31 20 20 20 20 20 20  |        .1      |
00000060  20 20 1b 31                                       |  .1|
00000064

6

उपरोक्त सभी अच्छे जवाबों के अलावा, हम यह देखने के लिए कुछ स्ट्रीम्स कर सकते हैं:

$ strace -e trace=write echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
write(1, "\33[H\33[2J", 7

$ strace -e trace=write clear
write(1, "\33[H\33[2J", 7

आप देख सकते हैं, दो कमांड समान प्रदान करते हैं ANSI escape sequences


0

सबसे पहले / बिन / प्रतिध्वनि -e "\ X1b \ x5b \ x48 \ X1b \ x5b \ x32 \ x4a \ c" वास्तव में स्क्रीन को साफ नहीं करता है। आप पिछली सामग्री को देखने के लिए स्क्रॉल कर सकते हैं।

दूसरे, मैंने आईआरबी खोला (जो एक इंटरेक्टिव रूबी शेल है), और टाइप किया गया:

p `clear`

या

p %x(clear)

या:

require 'open3'
p Open3.capture2('clear')[0]

सभी कोड वापस आ जाएं "\e[3J\e[H\e[2J"

अब अपना टर्मिनल खोलें, टाइप करें echo -e "\e[3J\e[H\e[2J"

यह स्क्रीन को साफ करना चाहिए। इन्हें एएनएसआई एस्केप सीक्वेंस कहा जाता है:

https://en.wikipedia.org/wiki/ANSI_escape_code

आप एक पाठ को ब्लिंक करने के लिए इन कोडों का उपयोग कर सकते हैं ( \e[5m), एक पाठ को रंगीन करें: ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) और कई अन्य चीजें!

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