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...
也许值得研究一下 的功能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)
这个逻辑的目的是:
计算出屏幕上有多少行并移动到底部
计算出有多少列并构建分隔线以跨越那么多列
打印分隔行,然后打印状态行
话虽如此,我确信一定有一种更优雅的方式来实现你想做的事情......