
답변1
여기서 주목해야 할 중요한 점은 질문의 태그입니다. 이 동작은 GNOME 터미널과 libvte를 기반으로 구축된 기타 터미널 에뮬레이터에만 해당됩니다. Xterm, 유니코드 RXVT, Linux 커널에 내장된 터미널 에뮬레이터 또는 FreeBSD 콘솔에서는 이 내용을 볼 수 없습니다.
일반적으로 일어나는 일은 다음과 같습니다.
- 이
clear
명령은 terminfo/termcap을 보고 적절한 제어 순서를 발행합니다.- terminfo/termcap 항목에
E3
기능이 있으면 먼저 해당 기능을 작성합니다. 이는 스크롤백 버퍼를 지우는 제어 시퀀스를 발행합니다. 이것과 그 뒤에 숨겨진 역사는 다음 문서에 자세히 기록되어 있습니다.clear
명령 에 대한 Dickey ncurses 매뉴얼 페이지. clear
그런 다음 보이는 화면을 지우는 기능을 사용합니다 .
- terminfo/termcap 항목에
- terminfo/termcap 항목의 제어 순서는 터미널 유형에 따라 결정됩니다. 그러나 화면을 지우기 위해 FormFeed를 사용하는 (요즘은 드물게) 터미널을 제외하면(DEC VT와 그 모방자는 그렇지 않음) 이는 단지 평범한 ECMA-48 제어 시퀀스이거나 이에 대한 확장입니다. 예를 들어:
- 항목
putty
E3=\E[3J
Xterm 확장 제어 시퀀스가 무엇인지 정의합니다 . - NetBSD 콘솔의
pcvtxx
항목clear=\E[H\E[J
정의하는 많은 것 중 하나입니다 . 이는 두 개의 일반적인 ECMA-48 제어 시퀀스입니다.
- 항목
- 터미널 에뮬레이터는 제어 시퀀스에 따라 작동합니다. ECMA-48 및 Xterm 확장에 정의된 대로:
- CSI
H
(CUP)는 커서를 홈에 둡니다. - CSI
0
J
(ED 0) 또는 CSI만J
현재 커서 위치부터 화면 끝까지 지웁니다. - CSI
2
J
(ED 2)는 화면 전체를 지웁니다. - CSI
3
J
(ED 3)는 스크롤백 버퍼를 지웁니다.
- CSI
특히 GNOME 터미널의 경우:
- 터미널 유형이 적절
gnome
하지만 일부 사람들은 잘못 설정하여 둡니다xterm
. - terminfo
gnome
항목기능을 정의하지 않으며E3
많은 시스템에서 여전히 그렇습니다! —xterm
항목도 아래로 여과되지 않았기 때문에 항목도 포함 되지 않습니다.디키 용어 정보. 따라서 기능clear
의 내용을 작성하면 됩니다clear
. - 해당 terminfo 항목에 대한 기능 의 내용은
clear
커서를 홈으로 이동시킨 후 전체 화면을 지우는 제어 시퀀스입니다. - 그러나 그놈 터미널은 전체 화면을 올바르게 지우는 기능을 구현하지 않습니다. 더 구체적으로 말하자면, 이를 기반으로 하는 라이브러리인 libvte는 다음 코드에서 해당 작업을 수행하지 않습니다.그
VteTerminalPrivate::seq_clear_screen()
기능. 오히려 libvte는 전체 화면에 해당하는 빈 줄까지 화면을 스크롤하고 커서 위치를 해당 빈 줄 중 첫 번째로 이동합니다.
이것이 당신이 보는 것을 보는 이유입니다. libvte는 지시를 받았을 때 전체 화면을 지우지 않습니다. 오히려 질문자가 여기서 수행한 작업을 정확히 수행할 때까지 표면적으로 유사한 작업을 수행합니다. 즉, 터미널 창을 뒤로 스크롤하여 뒤로 스크롤 버퍼를 확인합니다. 그렇다면 그 차이는 극명하다.
Xterm 및 Unicode RXVT와 같은 다른 터미널 에뮬레이터에서 ED 2 제어 시퀀스는 실제로 화면을 지우고 화면의 모든 위치를 위에서 아래로 지우고 스크롤백 버퍼를 변경하지 않습니다. 그러나 libvte 터미널 에뮬레이터에서는 현재 화면을 스크롤백 버퍼로 푸시하고 화면 분량의 빈 줄을 추가합니다. 이전 화면 내용은 삭제되지 않고 스크롤백 버퍼로 이동됩니다.
그리고 명령을 두 번 실행하면 clear
다음이 추가됩니다.둘화면의 빈 줄만큼. 뒤로 스크롤 버퍼가 충분히 크면 다음을 수행할 수 있습니다.아직원래 화면 내용을 찾으려면 스크롤백 버퍼에서 더 위쪽으로 이동하면 됩니다.
추가 읽기
- 코딩된 문자 세트에 대한 제어 기능. ECMA-48. 1976.
- 게오르기 키릴로프(2007-12-30).Ctrl-L은 스크롤백 버퍼에 공백을 추가합니다.. 그놈 버그 #506438.
- VT100을 기반으로 하는 xterm, xterm-color 및 Linux 터미널 에뮬레이터는 어느 정도입니까?
- "이전" 스크롤백 버퍼 지우기
- Bash Clear 명령 이상한 동작으로 인해 스크롤백 버퍼가 삭제됩니다.
- https://superuser.com/questions/1094599/
- 토마스 디키(2018). "XTerm 및 유사 항목의 알려진 버그: GNOME 터미널". XTerm 자주 묻는 질문. 보이지 않는 섬.net.
- 토마스 디키(2018). "XTerm 및 유사 항목의 알려진 버그: VTE에 대한 참고 사항". XTerm 자주 묻는 질문. 보이지 않는 섬.net.
답변2
터미널을 지우고 전체 출력 버퍼를 파괴하려면 tput reset
. 예를 들어 이전 프로그램이 충돌하여 터미널을 깨끗하지 않은 상태로 남겨둔 경우 확실히 터미널을 지우고 상태를 보너스로 수정합니다. 또한 tput
올바른 터미널 유형을 파악할 수 있을 만큼 똑똑해야 터미널이 VT100을 사용하는지 또는 다른 명령 시퀀스를 사용하는지 알 필요가 없습니다.
POSIX에서 정의한 대로 tput reset
모든 POSIX 호환 시스템에서도 작동해야 합니다.https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html