bash script, erase previous line?

前端 未结 6 1273
暗喜
暗喜 2021-01-31 10:31

In lots of Linux programs, like curl, wget, and anything with a progress meter, they have the bottom line constantly update, every certain amount of time. How do I do that in a

6条回答
  •  一整个雨季
    2021-01-31 11:07

    To actually erase previous lines, not just the current line, you can use the following bash functions:

    # Clears the entire current line regardless of terminal size.
    # See the magic by running:
    # { sleep 1; clear_this_line ; }&
    clear_this_line(){
            printf '\r'
            cols="$(tput cols)"
            for i in $(seq "$cols"); do
                    printf ' '
            done
            printf '\r'
    }
    
    # Erases the amount of lines specified.
    # Usage: erase_lines [AMOUNT]
    # See the magic by running:
    # { sleep 1; erase_lines 2; }&
    erase_lines(){
            # Default line count to 1.
            test -z "$1" && lines="1" || lines="$1"
    
            # This is what we use to move the cursor to previous lines.
            UP='\033[1A'
    
            # Exit if erase count is zero.
            [ "$lines" = 0 ] && return
    
            # Erase.
            if [ "$lines" = 1 ]; then
                    clear_this_line
            else
                    lines=$((lines-1))
                    clear_this_line
                    for i in $(seq "$lines"); do
                            printf "$UP"
                            clear_this_line
                    done
            fi
    }
    

    Now, simply call erase_lines 5 for example to clear the last 5 lines in the terminal.

提交回复
热议问题