나는 최근에 쉘이 어떻게 작동하는지에 대해 더 많이 배우려고 노력했고 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
033
인 Esc
상기 출력이 간단하므로, 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는 이스케이프 시퀀스를 사용하는 $TERM
ANSI 또는 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
) 및 기타 여러 가지!