How to delete and replace last line in the terminal using bash?

后端 未结 7 1206

I want to implement a progress bar showing elapsed seconds in bash. For this, I need to erase the last line shown on the screen (command \"clear\" erases all the screen, but

7条回答
  •  旧时难觅i
    2020-11-30 18:22

    The \033 method didn't work for me. The \r method works but it doesn't actually erase anything, just puts the cursor at the beginning of the line. So if the new string is shorter than the old one you can see the leftover text at the end of the line. In the end tput was the best way to go. It has other uses besides the cursor stuff plus it comes pre-installed in many Linux & BSD distros so it should be available for most bash users.

    #/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
    

    Here's a little countdown script to play with:

    #!/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"
    

提交回复
热议问题