linux - 进度条 + ETA 与 pv 命令在同一行

标签 linux bash macos shell pv

简介

我在管道中使用 pv 命令来显示进度条。我用一个简单的计数器试了一下:

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | pv --progress --line-mode --size 100 --eta --timer

这工作正常,但我希望进度条显示在同一行上。 This answer解释了如何做到这一点。

所以我试了一下:

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | >&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer

它保持在一行,但现在不再更新 ETA。

问题

我怎样才能让 ETA 也更新?

更新

现在 iBug answered the question从上一节中,我意识到我还有一个相关的要求:需要保留 stdout 以便在下一个管道中使用它。在我的具体情况下,我需要将结果写入文件(即 > some-file.txt)

最佳答案

你输入了错误的命令。

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | >&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer
                                                                               ^

pv 之前有一个分号,所以您实际上是在 stdin/stdout 上运行它,这是您的终端。您应该将额外的 echopv 分组,让它从 for 循环中读取:

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | (>&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer)

为什么第一个命令不是这种情况?这是因为整个 for do done 子句被视为单个命令,所以它的结果正确地通过管道传输到 pv。然而,在第二个命令中,结果通过管道传输到 echo。您知道,echo 不会从标准输入中读取任何内容。

因为 pv 将 stdin 定向到 stdout,数字也会输出到终端,这与 stderr 的指示混合在一起。要抑制正常输出,将其重定向到/dev/null,所以最后的命令是

for (( i = 1 ; i <= 100 ; i++ )); do sleep 1; echo $i; done | (>&2 echo -en "\r"; pv --progress --line-mode --size 100 --eta --timer) > /dev/null

如果要将输出重定向到文件,只需在命令末尾更改 /dev/null

关于linux - 进度条 + ETA 与 pv 命令在同一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47813665/

相关文章:

java - JPanels 没有出现在 Eclipse IDE 中?

cocoa - 有从 Mac 上的传感器获取数据的示例代码吗?

regex - 在 sed 模式中指定 "-"

c - 无法通过linux串口读取

bash - 可以通过CLI在Linux中使音频静音的脚本有效,但需要帮助

Bash 参数扩展 - 获取文件的直接父目录

linux - 为什么NTP监听的是广播IP

c - 如何以编程方式打开默认浏览器并在 C/Linux 中传递 URL?

linux - 在 bash 中使用 UTF 字符

c++ - 在 Mac 上使用 intel 编译器编译 C++ 代码时出现错误 : expected an identifier