터미널 스크롤백을 잃지 않고 명령줄에서 여러 줄의 표준 출력을 덮어쓸 수 있습니까?

터미널 스크롤백을 잃지 않고 명령줄에서 여러 줄의 표준 출력을 덮어쓸 수 있습니까?

여러 개의 진행률 표시줄을 만들고 전체 화면을 지우지 않고 언제든지 업데이트하고 싶습니다(이전 표준 출력 콘텐츠가 화면에 남아 있기를 원합니다).

다음을 수행해야 합니다.

  1. 몇 줄 쓰다echo
  2. 함께 기다리다sleep
  3. 커서를 첫 번째 줄의 시작 부분으로 되돌립니다.
  4. 업데이트된 정보로 내 행 중 일부를 덮어씁니다.
  5. 2단계부터 반복합니다.

아이디어는 사용자가 이전 stdout 콘텐츠를 읽기 위해 뒤로 스크롤할 수 있기를 원한다는 것입니다.

롤백에 관심이 없다면 clear필요한 것을 다시 사용하고 작성할 수 있습니다.

while [ true ]; do echo "$SECONDS"; sleep 0.1; clear; done

그러나 clear이전 터미널 출력을 보기에서 밀어낼 수 있을 만큼만 줄 바꿈이 인쇄되므로 스크롤백을 완전히 읽을 수 없게 됩니다.

실행 htop하고 닫으면 터미널이 htop을 시작할 때와 똑같은 상태로 복원됩니다. bash 스크립트에서 이와 같은 작업을 수행할 수 있습니까?

답변1

tput sc tput ed및 을 사용합니다 tput rc.

~에서매뉴얼 입력:

tput sc

커서 위치 저장

tput rc

커서 위치 복원

tput ed

화면 끝까지 지움

예:

tput sc
while :; do
    tput ed
    echo -e "$SECONDS\n$SECONDS\n$SECONDS"
    sleep 1
    tput rc
done

어떻게 작동하나요?

  1. 커서 위치 저장tput sc
  2. 화면의 정보를 업데이트하는 루프를 입력하세요.
  3. tput ed올바른 결과를 얻으려면 화면 끝까지 지웁니다.
  4. 그런 다음 변경된 데이터의 여러 행이 기록됩니다.echo
  5. sleep 1새로고침하기 전에 1초 정도 기다리세요.
  6. tput rc방금 인쇄한 줄의 시작 부분으로 커서를 다시 이동합니다.
  7. 반복해서 새 정보로 덮어쓰기

답변2

커서를 한 줄 위로 이동한 다음 tput cuu1(또는 덮어쓰려면 위로 이동해야 하는 몇 줄만큼) 덮어씁니다.

예를 들어:

echo -e "foo\nbar"
tput cuu1
tput cuu1
echo -e "baz\nquux"

생산하다:

baz
quux

관련 정보