![在 Bash 中创建类似表格的 CLI 显示的最佳方法?](https://linux22.com/image/122719/%E5%9C%A8%20Bash%20%E4%B8%AD%E5%88%9B%E5%BB%BA%E7%B1%BB%E4%BC%BC%E8%A1%A8%E6%A0%BC%E7%9A%84%20CLI%20%E6%98%BE%E7%A4%BA%E7%9A%84%E6%9C%80%E4%BD%B3%E6%96%B9%E6%B3%95%EF%BC%9F.png)
我正在编写一个用于大规模 USB 闪存测试的 Bash 脚本(f3
在后台使用)。我需要显示一个包含多个列和单元格的类似表格的界面。
目前我正在使用printf
with ,它看起来像这样:
我为每个驱动器运行一个单独的函数,将文本写入日志文件。解析这些日志文件以向用户显示信息。
正如您所看到的,有些行具有不应该存在的偏移量,但我无法摆脱它们,这似乎不是由打印的长字符串引起的。我不知道这是什么。
我遇到的另一个问题是刷新时间以及有时需要手动清除和重绘整个屏幕,因为偶尔会出现 stderr 消息,grep
或者cat
当某些文件无法正确读取时。
我目前正在对该脚本进行部分重写,并且我可以更好地在屏幕上打印数据。我想过调查一下,ncurses
但这似乎有点太复杂了,可能会让我维护起来变得复杂。
我想知道是否有一种方法可以让我将echo
或print
命令转储到文本文件中,然后立即执行所有命令以基本上拥有一个文本“后缓冲区”,以便我的刷新可以更加一致和更快?
我还希望能够监听用户的击键并在后台做出反应,但这不是优先事项。
也许有更好的方法在 Bash 中做这种事情,但我不知道?
答案1
使用column -t
应该适合你。
答案2
您可以使用tput
移动光标,例如tput cup 0 0; echo test
将写“测试”到屏幕的左上角。
或者,如果您想使用缓冲方法,您可以将行转储到文件中,清除屏幕并捕获文件:
# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit
# Main lopp
while true
do
echo "TEST" >$TEMPFILE # Clear file and set first line with >
date >>$TEMPFILE # Append lines to file with >>
clear # Clear the screen
cat $TEMPFILE # Dump the file
sleep 1 # Just for testing to avoid high CPU
done
trap
如果您想保留临时文件以进行调试,请注释掉该行。
答案3
我认为您已经几乎实现了您的目标,尽管存在一些小错误,并且可能存在一些性能问题。就我个人而言,我会首先尝试解决错误,然后尝试了解可以改进性能的地方。然而,关于刷新率,即使像 top 或 watch 这样的程序通常每 2 或 1 秒刷新一次,这通常就足够了。你没有说,你想达到什么速度。
有一个类似的堆栈交换问题,其中有两个答案/建议,
- 使用该程序
dialog
是另外一件需要学习的事情。 - 显示 bash 函数的创建,用于清除、重置、在屏幕上的某个位置写入文本,这是您可能会在 中使用的一组类似函数
ncurses
,但具有使用 echo(bash 内置函数)的优点,因此它不承担运行/usr/bin/printf
格式化输出的开销。
依次解决您的问题。
从后台命令打印错误。
/dev/null
如果您只想丢弃它,则将 stderr 重定向 到一个文件以供以后处理。列错误,显示您的代码,输入数据和所需的输出,然后我们可以提出建议。此 bug 可能是 bug #1 的影响,因此请先解决 #1,然后再解决此问题(如果它仍然存在)。
性能,(编辑您的问题)并添加您的代码,以便我们可以看到您在做什么并提出建议。
另一种方法是使用不同的脚本解释器,有很多选择取决于您熟悉的脚本解释器。 (awk、python、perl、其他 shell,...)。但是,如果您不打算使用 ncurses,其bash
原理将类似于第二个答案多于。