在控制台上显示持久状态消息

Cal*_* Xu 8 bash shell stdout output

我正在研究一个向stdout发送大量输出的程序,但我希望能够轻松地告诉程序正在做什么.我已经看到一些程序显示脚本或程序的输出,但控制台上的最后一行是"保留",这意味着命令的输出显示在屏幕上,但是最后一行(或两行,或者多行) )保留用于静态或偶尔改变的状态文本(例如Building <xxxxxx>...).这样,可以从脚本/程序中看到输出以进行调试/故障排除,但也可以快速浏览并查看程序的状态.有没有办法用shell脚本实现这个目的?我不介意使用内置的系统工具,例如awk,格式化文本,只要所使用的工具在大多数系统中都很常见.如果可能的话,我也想避免ncurses和其他图书馆一起使用.

如果你仍然不明白我在说什么,我会试着在这里说明一下:

make -gcc -NOFLAGS -someotherGibberishHere Component1afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component2afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component3afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component4afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component5afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component6afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component7afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component8afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component9afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component10afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component11afdjadfjfadkladfjk

.
. (etc.)
.

------------------------------------------------------------------------
Installing component 11/134...

在这个特定的例子中,即使控制台输出开始滚动,我也希望"安装组件11/134 ......"这一行保持在那里.最好,我也想把这条线保持在它上面.

这样,一旦我们进入程序的厚度并且通常shell将开始滚动,我们仍然会看到:

.
. (more lines of output here)
.
make -gcc -NOFLAGS -someotherGibberishHere Component58afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component59afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component60afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component61afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component62afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component63afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component64afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component65afdjadfjfadkladfjk
make -gcc -NOFLAGS -someotherGibberishHere Component66afdjadfjfadkladfjk
------------------------------------------------------------------------
Installing component 66/134...

Lin*_*ler 3

也许值得研究一下 的功能tput

类似下面的内容可以构成始终在屏幕底部打印状态行的解决方案的开头:

numlines=$(tput lines)
numcols=$(tput cols)
numcols=$(expr $numcols - 1)
separator_line=$(for i in $(seq 0 $numcols);do printf "%s" "-";done;printf "\n")
tput cup $numlines
echo $separator_line
echo <your status line>
Run Code Online (Sandbox Code Playgroud)

这个逻辑的目的是:

  • 计算出屏幕上有多少行并移动到底部

  • 计算出有多少列并构建分隔线以跨越那么多列

  • 打印分隔行,然后打印状态行

话虽如此,我确信一定有一种更优雅的方式来实现你想做的事情......