나는 최근 쉘이 어떻게 작동하는지 더 많이 이해하고 clear
명령이 어떻게 작동하는지 조사하려고 노력해 왔습니다. 실행 파일은 에 있으며 /usr/bin/clear
, 빈 줄(터미널 높이와 동일)을 인쇄하고 커서를 터미널의 왼쪽 상단에 배치하는 것으로 보입니다.
터미널 크기에 관계없이 명령의 출력은 항상 동일합니다.
$ clear | hexdump -C
00000000 1b 5b 48 1b 5b 32 4a |.[H.[2J|
00000007
그리고 정확히 동일한 효과로 echo를 사용하여 복제할 수 있습니다.
$ /bin/echo -e "\x1b\x5b\x48\x1b\x5b\x32\x4a\c"
이 명령의 출력이 어떻게 콘솔 지우기로 변환되는지 정말 궁금합니다.
답변1
이 명령의 출력은 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
답변2
특정 방출을 통해 작동합니다.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
.
답변3
Clear(1)에서 보낸 출력은 쉘 환경에서 $TERM으로 정의된 터미널 유형에 따라 다릅니다. 이는 현재 터미널 유형에 대한 이스케이프 코드를 찾아 해당 문자열을 표준 출력으로 보내는 "tputclear" 명령과 동일한 작업을 수행합니다.
Clear/tput에서 이스케이프 코드를 수신한 터미널은 이를 해석하고 로컬 디스플레이를 지우는 등 전송된 명령을 실행합니다. "터미널"은 ssh 또는 telnet을 통해 로컬 콘솔 또는 터미널 세션(putty, xterm 등)을 나타냅니다.
답변4
위의 모든 좋은 답변 외에도 어떤 일이 일어나는지 확인하기 위해 몇 가지 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
.