여러 개의 진행률 표시줄을 만들고 전체 화면을 지우지 않고 언제든지 업데이트하고 싶습니다(이전 표준 출력 콘텐츠가 화면에 남아 있기를 원합니다).
다음을 수행해야 합니다.
- 몇 줄 쓰다
echo
- 함께 기다리다
sleep
- 커서를 첫 번째 줄의 시작 부분으로 되돌립니다.
- 업데이트된 정보로 내 행 중 일부를 덮어씁니다.
- 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
어떻게 작동하나요?
- 커서 위치 저장
tput sc
- 화면의 정보를 업데이트하는 루프를 입력하세요.
tput ed
올바른 결과를 얻으려면 화면 끝까지 지웁니다.- 그런 다음 변경된 데이터의 여러 행이 기록됩니다.
echo
sleep 1
새로고침하기 전에 1초 정도 기다리세요.tput rc
방금 인쇄한 줄의 시작 부분으로 커서를 다시 이동합니다.- 반복해서 새 정보로 덮어쓰기
답변2
커서를 한 줄 위로 이동한 다음 tput cuu1
(또는 덮어쓰려면 위로 이동해야 하는 몇 줄만큼) 덮어씁니다.
예를 들어:
echo -e "foo\nbar"
tput cuu1
tput cuu1
echo -e "baz\nquux"
생산하다:
baz
quux