명확한 명령은 어떻게 작동합니까? 높이와 같은 빈 줄을 인쇄하여

나는 최근에 쉘이 어떻게 작동하는지에 대해 더 많이 배우려고 노력했고 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"

이 명령의 출력이 콘솔을 지우는 방법에 대해 궁금합니다.



답변

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

답변

특정 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.


답변

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

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


답변

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

답변

위의 모든 좋은 대답 외에도 우리는 무슨 일이 일어나는지 알기 위해 약간의 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.


답변

먼저 / 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) 및 기타 여러 가지!