如果一个命令要输出一个实时更新的进度条,直到它停止,并且我想不断获取所述进度条的百分比并将其显示在 GUI(例如 zenity)中,那么我们将如何执行此操作。
我确实知道如何在命令结束时获取它,并将其存储在变量中。这是该网站上大多数问题提出的问题,但我想在命令运行时执行此操作。
我认为这是可能的,因为许多应用程序已经这样做了,例如许多游戏启动器、应用程序商店等。再一次,我将如何继续做同样的事情?
答案1
将命令的输出实时发送到另一个命令通常是使用管道完成的。
如果进度条格式看起来像wget
您在评论中所说的那样:
[...]
92750K .......... .......... .......... .......... .......... 12% 3.81M 3m31s
92800K .......... .......... .......... .......... .......... 12% 4.36M 3m29s
92850K .......... .......... .......... .......... .......... 12% 4.05M 3m28s
92900K .......... .......... .......... .......... .......... 12% 4.04M 3m26s
92950K .......... .......... .......... .......... .......... 12% 3.86M 3m25s
93000K .......... .......... .......... .......... .......... 12% 3.98M 3m24s
93050K .......... .......... .......... .......... .......... 12% 3.86M 3m23s
93100K .......... .......... .......... .......... .......... 12% 3.31M 3m22s
[...]
当输出没有发送到 tty 时,您可以执行以下操作(假设是 GNU grep
):
wget ... 2>&1 |
grep --line-buffered -Po ' \K\d+(?=%)' |
zenity --progress
也就是说,提取百分比数字,并将其发送到zenity
的 stdin。
笔记:
2>&1
aswget
在 stderr 上打印其进度条(很常见)。--line-buffered
否则,鉴于其输出不发送到 tty 设备,grep
否则将缓冲其输出。