使“sudo apt-get update”仅在一行上输出正在执行的操作

使“sudo apt-get update”仅在一行上输出正在执行的操作

我想sudo apt-get update在一行上报告它正在做什么,而不是用它的输出填满终端窗口。但我不想隐藏可能的错误信息。

我的意思是这样的,但是写下最后一行,它会发生变化,并且在输出之后不可见sudo apt-get update

sudo apt-get update | xargs -I{} printf '%-*s\r' $(tput cols) "{}"
printf '\n

如果它可以写入给定数量的行,并且滚动这些行而不隐藏终端窗口中其输出之前的文本,那就太好了。

答案1

如果没有编写使用 ncurses 或类似程序来控制终端的适当应用程序,这将很难实现。使用 bash,您可以使用以下脚本获得一些这样的效果:

#! /bin/bash
height=${1:-5}

# Buffer up to the height
do_height()
{
    for ((i = 0; i < height; i++))
    do
        "$@"
    done
}

do_height printf "%-${cols}s\n" ""

# Get dimensions of terminal
cols=$(tput cols)
lines=$(tput lines)

sudo apt-get update |&
    while IFS= read -r line
    do 
        sleep 0.01
        if [[ $line =~ ^(Hit|Get|Fetch|Read) ]]
        then
            out=("$line" "${out[@]:0:4}")
        else
            out=("" "${out[@]:0:4}")
            tput cup $((lines - height - 1)) 0
            printf "%-${cols}s\n" "$line"
            do_height printf "%-${cols}s\n" ""
        fi
        tput cup $((lines - height - 1)) 0
        for ((i = height - 1; i >= 0; i--))
        do
            printf "%-${cols}s\n" "${out[i]}"
        done
    done

运行方式,foo.sh N其中 N 是要保留的行数。请注意:

  • 假设您位于终端的底部。
  • 错误总是会打印在最后一行上面 N 行。
  • apt-get在打印到终端时提供更多瞬态输出,因此由于中间线不可用,此处的输出会显得不稳定。

所以最终的输出将如下所示:

在此处输入图片描述

相关内容