추가 읽기

추가 읽기

명령을 사용하여 clear화면을 지울 때. 지워지지 않습니다(명령이 완료된 후 조금 위로 스크롤하면 스크린샷 참조).

여기에 이미지 설명을 입력하세요

그래서 올바른 동작을 얻기 위해 명령을 두 배로 늘렸습니다.

$ clear && clear && DD=0 ...

여기에 이미지 설명을 입력하세요

화면을 지우려면 명령을 두 배로 늘려야 하는 이유는 무엇입니까?

UPD

실제로 clear화면이 지워졌다면. 하지만 위로 스크롤하면 마지막 25줄을 볼 수 있습니다(화면이 80x25인 경우). 내가 달리면 clear;clear그 줄이 지워졌습니다.

답변1

여기서 주목해야 할 중요한 점은 질문의 태그입니다. 이 동작은 GNOME 터미널과 libvte를 기반으로 구축된 기타 터미널 에뮬레이터에만 해당됩니다. Xterm, 유니코드 RXVT, Linux 커널에 내장된 터미널 에뮬레이터 또는 FreeBSD 콘솔에서는 이 내용을 볼 수 없습니다.

일반적으로 일어나는 일은 다음과 같습니다.

  1. clear명령은 terminfo/termcap을 보고 적절한 제어 순서를 발행합니다.
    1. terminfo/termcap 항목에 E3기능이 있으면 먼저 해당 기능을 작성합니다. 이는 스크롤백 버퍼를 지우는 제어 시퀀스를 발행합니다. 이것과 그 뒤에 숨겨진 역사는 다음 문서에 자세히 기록되어 있습니다.clear명령 에 대한 Dickey ncurses 매뉴얼 페이지.
    2. clear그런 다음 보이는 화면을 지우는 기능을 사용합니다 .
  2. terminfo/termcap 항목의 제어 순서는 터미널 유형에 따라 결정됩니다. 그러나 화면을 지우기 위해 FormFeed를 사용하는 (요즘은 드물게) 터미널을 제외하면(DEC VT와 그 모방자는 그렇지 않음) 이는 단지 평범한 ECMA-48 제어 시퀀스이거나 이에 대한 확장입니다. 예를 들어:
    • 항목puttyE3=\E[3JXterm 확장 제어 시퀀스가 ​​무엇인지 정의합니다 .
    • NetBSD 콘솔의 pcvtxx항목clear=\E[H\E[J정의하는 많은 것 중 하나입니다 . 이는 두 개의 일반적인 ECMA-48 제어 시퀀스입니다.
  3. 터미널 에뮬레이터는 제어 시퀀스에 따라 작동합니다. ECMA-48 및 Xterm 확장에 정의된 대로:
    • CSI H(CUP)는 커서를 홈에 둡니다.
    • CSI 0 J(ED 0) 또는 CSI만 J현재 커서 위치부터 화면 끝까지 지웁니다.
    • CSI 2 J(ED 2)는 화면 전체를 지웁니다.
    • CSI 3 J(ED 3)는 스크롤백 버퍼를 지웁니다.

특히 GNOME 터미널의 경우:

  1. 터미널 유형이 적절 gnome하지만 일부 사람들은 잘못 설정하여 둡니다 xterm.
  2. terminfo gnome항목기능을 정의하지 않으며 E3많은 시스템에서 여전히 그렇습니다! — xterm항목도 아래로 여과되지 않았기 때문에 항목도 포함 되지 않습니다.디키 용어 정보. 따라서 기능 clear의 내용을 작성하면 됩니다 clear.
  3. 해당 terminfo 항목에 대한 기능 의 내용은 clear커서를 홈으로 이동시킨 후 전체 화면을 지우는 제어 시퀀스입니다.
  4. 그러나 그놈 터미널은 전체 화면을 올바르게 지우는 기능을 구현하지 않습니다. 더 구체적으로 말하자면, 이를 기반으로 하는 라이브러리인 libvte는 다음 코드에서 해당 작업을 수행하지 않습니다.VteTerminalPrivate::seq_clear_screen()기능. 오히려 libvte는 전체 화면에 해당하는 빈 줄까지 화면을 스크롤하고 커서 위치를 해당 빈 줄 중 첫 번째로 이동합니다.

이것이 당신이 보는 것을 보는 이유입니다. libvte는 지시를 받았을 때 전체 화면을 지우지 않습니다. 오히려 질문자가 여기서 수행한 작업을 정확히 수행할 때까지 표면적으로 유사한 작업을 수행합니다. 즉, 터미널 창을 뒤로 스크롤하여 뒤로 스크롤 버퍼를 확인합니다. 그렇다면 그 차이는 극명하다.

Xterm 및 Unicode RXVT와 같은 다른 터미널 에뮬레이터에서 ED 2 제어 시퀀스는 실제로 화면을 지우고 화면의 모든 위치를 위에서 아래로 지우고 스크롤백 버퍼를 변경하지 않습니다. 그러나 libvte 터미널 에뮬레이터에서는 현재 화면을 스크롤백 버퍼로 푸시하고 화면 분량의 빈 줄을 추가합니다. 이전 화면 내용은 삭제되지 않고 스크롤백 버퍼로 이동됩니다.

그리고 명령을 두 번 실행하면 clear다음이 추가됩니다.화면의 빈 줄만큼. 뒤로 스크롤 버퍼가 충분히 크면 다음을 수행할 수 있습니다.아직원래 화면 내용을 찾으려면 스크롤백 버퍼에서 더 위쪽으로 이동하면 됩니다.

추가 읽기

답변2

터미널을 지우고 전체 출력 버퍼를 파괴하려면 tput reset. 예를 들어 이전 프로그램이 충돌하여 터미널을 깨끗하지 않은 상태로 남겨둔 경우 확실히 터미널을 지우고 상태를 보너스로 수정합니다. 또한 tput올바른 터미널 유형을 파악할 수 있을 만큼 똑똑해야 터미널이 VT100을 사용하는지 또는 다른 명령 시퀀스를 사용하는지 알 필요가 없습니다.

POSIX에서 정의한 대로 tput reset모든 POSIX 호환 시스템에서도 작동해야 합니다.https://pubs.opengroup.org/onlinepubs/007904975/utilities/tput.html

관련 정보