명확한 명령은 어떻게 작동합니까?


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 + L-보기stty -a
mikeserv

답변:


26

clear명령 의 출력 은 콘솔 이스케이프 코드입니다. 필요한 정확한 코드는 사용중인 정확한 터미널에 따라 다르지만 대부분 ANSI 제어 시퀀스를 사용합니다. 다음은 다양한 코드를 설명하는 좋은 링크입니다 ( 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>16 진수 1B또는 8 진수 는 어디에 있습니까 033? 캐릭터를 보는 또 다른 방법은 다음과 같습니다.

clear | sed -n l

18

특정 ANSI 이스케이프 시퀀스 를 발행하여 작동 합니다 . 구체적으로,이 두 가지 :

Esc [Line; ColumnH 커서 위치 :
Esc [Line; Columnf) 커서를 지정된 위치 (좌표)로 이동합니다.
                                         위치를 지정 하지 않으면 커서가
                                         화면 왼쪽 상단 모서리 ( 홈 0, 열 0) 의 홈 위치로 이동합니다 .

Esc [2J 디스플레이 지우기 :
                                         화면을 지우고 커서를 홈 위치
                                         (라인 0, 열 0)로 이동합니다.

이것은 아마도 다음과 같은 결과를 이해하는 것이 더 쉽습니다 od -c.

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

033Esc상기 출력이 간단하므로, Esc[H다음 Esc[2J.


9

clear (1)에 의해 전송되는 출력은 쉘 환경에서 $ TERM에 의해 정의 된 터미널 유형에 따라 다릅니다. 현재 터미널 유형에 대한 이스케이프 코드를 찾고 해당 문자열을 표준 출력으로 보내는 "tput clear"명령과 동일한 기능을 수행합니다.

clear / tput에서 이스케이프 코드를 수신 한 터미널은이를 해석하여 로컬 디스플레이 지우기와 같이 전송 된 명령을 실행합니다. "터미널"은 ssh 또는 텔넷을 통한 로컬 콘솔 또는 터미널 세션 (퍼티, xterm 등)을 의미합니다.


7

TERMINFO (또는 TERMCAP)를 언급하지 않은 다른 답변에 놀랐습니다.

매뉴얼 페이지 Luke 사용

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명령은 당신이 경우 ANSI는 이스케이프 시퀀스를 사용하는 $TERMANSI 또는 XTERM 등 일부 ANSI 기반 터미널 유형으로 설정됩니다.

$ 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를 할 수 있습니다.

$ 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

먼저 / bin / echo -e "\ x1b \ x5b \ x48 \ x1b \ x5b \ x32 \ x4a \ c"는 실제로 화면을 지우지 않습니다. 위로 스크롤하여 이전 내용을 볼 수 있습니다.

둘째, 대화 형 Ruby 셸인 IRB를 열고 다음을 입력했습니다.

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"

화면이 지워 져야합니다. 이것을 ANSI 이스케이프 시퀀스라고합니다.

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

이 코드를 사용하여 텍스트 ( \e[5m) 를 깜박이고 텍스트 를 채색 할 수 있습니다 : ( for i in {0..255} ; do printf "\e[38;5;${i}m${i} " ; done ; echo) 및 기타 여러 가지!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.