bash를 사용하여 터미널의 마지막 줄을 삭제하고 바꾸는 방법은 무엇입니까?
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
http://en.wikipedia.org/wiki/ANSI_escape_code
Derek Veit의 대답은 라인 길이가 터미널 너비를 초과하지 않는 한 잘 작동합니다. 그렇지 않은 경우 다음 코드는 정크 출력을 방지합니다.
줄이 처음으로 작성되기 전에
tput sc
현재 커서 위치를 저장합니다. 이제 라인을 인쇄 할 때마다
tput rc
tput ed
echo "your stuff here"
먼저 저장된 커서 위치로 돌아간 다음 커서에서 아래쪽으로 화면을 지우고 마지막으로 출력을 씁니다.
\ 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"
같은 효과를 가지고 있어야한다.
Basically, with escape sequences you can control almost everything in the screen.
Use the carriage return character:
echo -e "Foo\rBar" # Will print "Bar"
Can achieve it by placing carriage return \r
.
In a single line of code with printf
for i in {10..1}; do printf "Counting down: $i\r" && sleep 1; done
or with echo -ne
for i in {10..1}; do echo -ne "Counting down: $i\r" && sleep 1; done
The simplest way is to use the \r
character I guess.
The drawback is that you can't have complete lines, as it only clears the current line.
Simple example:
time=5
echo -n "Elapsed $time seconds"
sleep 10
time=15
echo -n "Elapsed $time seconds"
echo "\nDone"
'IT story' 카테고리의 다른 글
Sublime Text-왼쪽에 열린 파일 표시 (0) | 2020.09.12 |
---|---|
라 라벨이 피벗 테이블에 여러 레코드를 추가하는 것을 방지 (0) | 2020.09.12 |
현재 데이터베이스 백업이 없기 때문에 BACKUP LOG를 수행 할 수 없습니다. (0) | 2020.09.12 |
Rails "validates_uniqueness_of"대소 문자 구분 (0) | 2020.09.12 |
Random strings in Python (0) | 2020.09.12 |