bash에서 경과 된 초를 표시하는 진행률 표시 줄을 구현하고 싶습니다. 이를 위해 화면에 표시된 마지막 줄을 지워야합니다 ( "clear"명령은 모든 화면을 지우지 만 진행 표시 줄의 줄만 지우고 새 정보로 교체해야 함).
최종 결과는 다음과 같습니다.
$ Elapsed time 5 seconds
그런 다음 10 초 후에이 문장 (화면의 같은 위치에 있음)을 다음과 같이 바꾸고 싶습니다.
$ Elapsed time 15 seconds
답변:
\ r로 캐리지 리턴을 에코
seq 1 1000000 | while read i; do echo -en "\r$i"; done
맨 에코에서 :
-n do not output the trailing newline
-e enable interpretation of backslash escapes
\r carriage return
캐리지 리턴 자체는 커서를 줄의 시작 부분으로 만 이동합니다. 출력의 각 새 줄이 적어도 이전 줄보다 길면 괜찮지 만 새 줄이 더 짧으면 이전 줄을 완전히 덮어 쓰지 않습니다. 예 :
$ echo -e "abcdefghijklmnopqrstuvwxyz\r0123456789"
0123456789klmnopqrstuvwxyz
실제로 새 텍스트에 대한 행을 삭제하려면, 당신은 추가 할 수 있습니다 \033[K애프터 \r:
$ echo -e "abcdefghijklmnopqrstuvwxyz\r\033[K0123456789"
0123456789
\e[K대신에 \033[K.
\033[Gio \r를 수행 할 수도 있습니다 . 또한 invisible-island.net/xterm/ctlseqs/ctlseqs.html 은 Wikipedia보다 자세한 내용을 제공하며 xterm 개발자가 제공합니다. \033[K\r
Derek Veit의 대답은 라인 길이가 터미널 너비를 초과하지 않는 한 잘 작동합니다. 그렇지 않은 경우 다음 코드는 정크 출력을 방지합니다.
줄이 처음으로 작성되기 전에
tput sc
현재 커서 위치를 저장합니다. 이제 라인을 인쇄 할 때마다
tput rc
tput ed
echo "your stuff here"
먼저 저장된 커서 위치로 돌아간 다음 커서에서 아래쪽으로 화면을 지우고 마지막으로 출력을 씁니다.
tput sc # save cursor echo '' > sessions.log.json while [ 1 ]; do curl 'http://localhost/jolokia/read/*:type=Manager,*/activeSessions,maxActiveSessions' >> sessions.log.json echo '' >> sessions.log.json cat sessions.log.json | jq '.' tput rc;tput el # rc = restore cursor, el = erase to end of line sleep 1 done
tput ed대신 tput el. @Um의 예제가 사용되었습니다 ed(아마 당신이 주석을 달고 나서 고쳤을 것입니다).
\ 033 방법이 작동하지 않았습니다. \ r 메서드는 작동하지만 실제로는 아무것도 지우지 않고 커서를 줄의 시작 부분에 놓습니다. 따라서 새 문자열이 이전 문자열보다 짧으면 줄 끝에 남은 텍스트를 볼 수 있습니다. 결국 tput은 가장 좋은 방법이었습니다. 커서 외에도 다른 용도로 사용되며 많은 Linux 및 BSD 배포판에 사전 설치되어 있으므로 대부분의 bash 사용자가 사용할 수 있습니다.
#/bin/bash
tput sc # save cursor
printf "Something that I made up for this string"
sleep 1
tput rc;tput el # rc = restore cursor, el = erase to end of line
printf "Another message for testing"
sleep 1
tput rc;tput el
printf "Yet another one"
sleep 1
tput rc;tput el
다음은 재생할 작은 카운트 다운 스크립트입니다.
#!/bin/bash
timeout () {
tput sc
time=$1; while [ $time -ge 0 ]; do
tput rc; tput el
printf "$2" $time
((time--))
sleep 1
done
tput rc; tput ed;
}
timeout 10 "Self-destructing in %s"
진행률 출력이 여러 줄이거 나 스크립트가 이미 새 줄 문자를 인쇄 한 경우 다음과 같이 줄을 이동할 수 있습니다.
printf "\033[5A"
그러면 커서가 5 줄 위로 점프합니다. 그런 다음 필요한 것을 덮어 쓸 수 있습니다.
그 작동하지 않을 경우 당신은 시도 할 수 printf "\e[5A"또는 echo -e "\033[5A"같은 효과를 가지고 있어야한다.
기본적으로 이스케이프 시퀀스 를 사용하면 화면의 거의 모든 것을 제어 할 수 있습니다.
tput cuu 5, 여기서 5는 행의 수입니다 ( cuu위로 cud이동, 아래로 이동).
for i in {1..100000}; do echo -en "\r$i"; done서열 호출 :-) 피하기 위해