IT story

bash를 사용하여 터미널의 마지막 줄을 삭제하고 바꾸는 방법은 무엇입니까?

hot-time 2020. 9. 12. 11:34
반응형

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"

참고URL : https://stackoverflow.com/questions/2388090/how-to-delete-and-replace-last-line-in-the-terminal-using-bash

반응형