추가 읽기

추가 읽기

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

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

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

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

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

화면을 지우려면 왜 이중 명령이 필요합니까?

UPD

실제로 clear화면을 지우기만 하면 됩니다. 하지만 위로 스크롤하면 마지막 25개 행을 볼 수 있습니다(화면이 80x25인 경우). 실행할 때 clear;clear이 줄을 지웁니다.

답변1

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

일반적으로 일어나는 일은 이것이다.

  1. clear명령은 terminfo/termcap을 보고 적절한 제어 순서를 발행합니다.
    1. terminfo/termcap 항목에 E3이 기능이 있으면 먼저 기록됩니다. 이는 스크롤백 버퍼를 지우는 제어 시퀀스를 발행합니다. 이것과 그 뒤에 숨겨진 역사는 다음에 자세히 설명되어 있습니다.clearDickey는 이 명령에 대한 ncurses 매뉴얼 페이지를 사용합니다..
    2. 그런 다음 clear이 기능을 사용하여 보이는 화면을 지웁니다.
  2. terminfo/termcap 항목의 제어 순서는 터미널 유형에 따라 결정됩니다. 그러나 화면을 지우기 위해 FormFeed를 사용하는 터미널을 제외하면(요즘에는 거의 발생하지 않음)(DEC VT 및 그 유사 프로그램에서는 이 작업을 수행하지 않음) 평범한 오래된 ECMA-48 제어 시퀀스이거나 그 확장입니다. 몇 가지 예:
    • putty입구E3=\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) 스크롤백 버퍼를 지웁니다.

그놈 터미널의 경우:

  1. 터미널 유형은 올바른 gnome데 일부 사람들은 이를 잘못 설정했습니다 xterm.
  2. 용어 정보 gnome항목이 기능은 정의되지 않았 E3으며 많은 시스템에서 그대로 유지됩니다! - 이 항목 xterm은 아직 삭제되지 않았으므로 존재하지 않습니다.Dickey 용어 정보. 그러니 능력의 내용 clear만 쓰세요 .clear
  3. 이러한 terminfo 항목의 기능적 내용은 clear커서를 반환한 다음 전체 화면을 지우는 제어 시퀀스입니다.
  4. 그러나 GNOME 터미널은 전체 화면 지우기를 제대로 수행할 수 없습니다. 보다 구체적으로, 기반 라이브러리인 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

관련 정보