我想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
在打印到终端时提供更多瞬态输出,因此由于中间线不可用,此处的输出会显得不稳定。
所以最终的输出将如下所示: