Bash Clear 명령의 이상한 동작으로 인해 스크롤백 버퍼가 삭제됩니다.

Bash Clear 명령의 이상한 동작으로 인해 스크롤백 버퍼가 삭제됩니다.

터미널에서 Clear를 실행할 때마다 화면 상단에서 현재 줄까지 스크롤백 버퍼가 삭제됩니다. xterm, st, urxvt에서 시도해 보았지만 문제는 동일합니다. 스크롤백 버퍼에 닿지 않도록 지우기 동작을 변경할 수 있는 방법이 있나요?

답변1

"화면 상단에서 현재 줄까지"라는 주석이 모호합니다. 위에서 말하는 거라면보이는 부분화면에 보이는 건 그게 아니고롤백. 터미널의 스크롤백은 스크롤바(또는 Shift pageup과 같은 적절한 키)를 사용해야만 볼 수 있는 부분입니다.

XTerm 제어 순서관련 이스케이프 시퀀스 로깅:

CSI Ps J  Erase in Display (ED).
            Ps = 0  -> Erase Below (default).
            Ps = 1  -> Erase Above.
            Ps = 2  -> Erase All.
            Ps = 3  -> Erase Saved Lines (xterm).

터미널 설명 기능은 clear마지막에서 두 번째를 사용합니다. 예:

clear=\E[H\E[2J

커서를 왼쪽 상단에 놓고 전체 (보이는) 화면을 지웁니다. 너할 수 있다사용아래 삭제이지만 단말기 설명에는 사용되지 않습니다.

참조 지우기롤백: 이것은 원래 xterm(1999년, 기록됨ctlseqs.ms그러나 변경 사항에는 언급되지 않았습니다) 및 이후(2011년)은 Linux 콘솔 및 해당 터미널 설명에 대한 확장으로 구현됩니다. 터미널 데이터베이스에는 다음과 같이 나열됩니다."기타 확장".

현재 이러한 터미널 설명에는 다음과 같은 특징이 있습니다.

xterm과 같은 VTE에서 지원되는지 여부는 테스트를 통해 답변해야 합니다(VTE 또는 Konsole에 대한 유용한 문서는 없습니다).

확장 프로그램을 사용하고 싶지 않으면 삭제할 수 있습니다.E3사용 중인 터미널 설명의 기능(예:

infocmp -1x >foo
edit foo, removing the line with "E3="
tic -x foo

옵션을 사용하는 것이 좋습니다-1그리고-x형식을 단순화하고 변경하려는 기능을 표시합니다. 에 주어진 예https://ghostbin.com/paste/kfsbj이 권장 사항에 따라:

  • /home/flowerpick/.terminfo/x/xtermncurses는 경로 이름을 사용합니다
  • 기능 AX및 은 옵션과 함께 표시되는 XT확장 기능(예: )입니다 .E3-x

여러 터미널 유형을 사용하는 경우 각 터미널 유형( 값)에 대해 $TERM이 작업을 수행 해야 하며 변경 사항은 실행 중인 컴퓨터에만 적용됩니다 clear. 출력의 처음 몇 줄은 현재 infocmp처리 중인 출력 줄을 보여줍니다.

#   Reconstructed via infocmp from file: /home/flowerpick/.terminfo/x/xterm
xterm|xterm terminal emulator (X Window System),

예를 들어, 다음과 같이 uxrvt설정하면 다음과 같은 줄이 생성됩니다 .$TERMrxvt-unicodeinfocmp

#       Reconstructed via infocmp from file: /lib/terminfo/r/rxvt-unicode       
rxvt-unicode|rxvt-unicode terminal (X Window System),

이 프로그램은 (또는 그럴 수도 있음 )을 st사용 하지만 한동안 이 프로그램의 복사본을 본 적이 없습니다.xtermxterm-256color저것그것은 훌륭하게 작동하며 리뷰할 가치가 있습니다.

그런데 당신은할 수 있다특정 이스케이프 시퀀스를 보내는 별칭 clear(터미널 설명 무시)이 있지만 이를 보고하는 사람은 본 적이 없습니다.

"위 항목 지우기"를 수행하려면 "지우기"를 입력하는 것만큼 간단하지 않습니다. 이스케이프 문자는 \033[1J왼쪽 상단부터 현재 커서 위치까지 지워집니다. 이 작업을 수행하는 스크립트를 만들 수 있습니다.철사현재 커서 위:

  • 커서 위치 보고서를 사용하여 현재 커서가 있는 행/열을 찾습니다.
  • 커서가 첫 번째 줄에 없으면(해당 위치 저장) 커서를 한 줄 위로 이동한 다음 (순서대로 hpa)옳은많은,
  • "위의 지우기" 문제를 해결하고
  • cup(커서 주소 지정)을 사용하면 원래 위치로 돌아갑니다.

커서 위치 보고 기능이 있는 부분이 (예를 들어) readline 바인딩과 작동하지 않는 것 같아서 스크립트를 제안했습니다. 첫 번째 줄의 문제가 존재하지 않으면 저장/복원 커서 기능을 사용하는 바인딩을 만들 수 있습니다.

답변2

.bashrc나는 같은 문제가 있었고 도움말에 별칭을 추가했습니다.

alias clear='printf "\E[H\E[2J"'

알림: .bashrc새 터미널을 열면 변경 사항이 적용됩니다!

답변3

나는 종종 clear명령 프롬프트를 사용하여 화면 상단으로 이동하고 이전 작업의 유용한 오류 메시지와 같은 중요한 콘텐츠가 포함된 스크롤백 버퍼를 실수로 삭제합니다.

매뉴얼 페이지를 확인하면 다음과 같이 명확하게 나와 있습니다.

Clear는 가능하다면 스크롤백 버퍼를 포함하여 화면을 지웁니다(확장된 "E3" 기능이 정의된 경우).

거기에는 다음과 같은 옵션도 있습니다.

-x 확장된 "E3" 기능을 사용하여 터미널의 스크롤백 버퍼를 지우려고 시도하지 마십시오.

그 이후로 ~/.bashrc의 별칭 목록에 추가했습니다.

alias clear='clear -x'

실행하면 여전히 맨 위로 이동하라는 메시지가 표시되지만 clear이제 필요한 경우 더 위로 스크롤할 수 있습니다.

답변4

내 솔루션은 다음 별칭을 내 이름에 추가하는 것이었습니다..bashrc

alias clear='tput reset'

스크롤백 버퍼에서 민감한 정보를 지우는 등의 원래 동작을 사용하려면 \다음과 같이 앞에 백슬래시를 추가하여 앨리어싱되지 않은 버전을 쉽게 호출할 수 있습니다.여기또는여기. 그것은 다음과 같습니다

\clear

관련 정보