如何在命令运行时读取命令的输出?

如何在命令运行时读取命令的输出?

如果一个命令要输出一个实时更新的进度条,直到它停止,并且我想不断获取所述进度条的百分比并将其显示在 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>&1aswget在 stderr 上打印其进度条(很常见)。
  • --line-buffered否则,鉴于其输出不发送到 tty 设备,grep否则将缓冲其输出。

相关内容