【问题标题】:How to display progress of another command如何显示另一个命令的进度
【发布时间】:2015-05-22 12:04:37
【问题描述】:

我需要帮助我运行这样的 bash 脚本:

do_something > file.txt(我在另一个 echo 输出中使用了这个 file.txt 的第三行)

现在我需要在 file.txt 的第二行获取一些字符。 (只有点 - “.”)

我可以用这个命令获取字符数:

progress=$(awk 'NR==2' file.txt | grep -o \. | wc -w)

但问题是,file.txt 和第二行的字符数是“进度条”,因此它会从 0 到 XY(即 100)个字符随时间变化。 我想用它来查看百分比进度:echo -ne "$progress % \\r"

我怎么能在一个循环中做到这一点? do_something > file.txt 必须只启动一次。在接下来的约 5-20 秒内,它会在第二行打印点,我必须将此数字每秒更新一次以输出回显“XY %”。

如何每秒读取 file.txt 并找到“新/更新”的字符数?* edit

编辑: *这是实时过程。我的 do_something > file.txt 正在向该文件“打印”点,我希望打印结果实时保存在 $progress 中。所以第一个命令是将点打印到文件中,我每秒实时计算它们并打印从 0-100 % 完成了多少百分比

【问题讨论】:

  • 您想什么时候停止打印?
  • 当 file.txt 的第二行达到 100 个字符时我会停止打印。
  • 查看我的更新答案 (stackoverflow.com/a/30396366/4408382),让我知道它是否适合您。

标签: bash shell command-line-interface


【解决方案1】:

您要做的是在后台运行do_something > file.txt,然后对其进行监控。您可以使用特殊的kill 信号0 来执行此操作。

do_something > file.txt &
PID=$!
while kill -0 $PID 2> /dev/null
do
    [calculate percent complete]
    [display percent complete]
    sleep 5
done

【讨论】:

  • 谢谢,这个解决方案也很有效,并且在代码中看起来很有效。现在我明白我必须在后台启动 do_something > file.txt :-) 多么简单,谢谢。 @Mort
【解决方案2】:

首先,您应该在后台运行您的命令:

do_something > file.txt &

然后你可以观察输出文件的变化。这将每秒无限打印第二行file.txt

while true; do sed -n '2p' < file.txt; sleep 1; done

如果你只想打印第二行有多少个字符,你可以这样做:

while true; do sed -n '2p' < file.txt | wc -m; sleep 1; done

如果要在第二行有 100 个字符时停止,可以这样做:

MAX="100"
CUR="0"
while [ $CUR -lt $MAX ]; do CUR=`sed -n '2p' < sprint | wc -m`; echo $CUR; sleep 1; done

【讨论】:

  • 谢谢!!我以这种形式使用它并且它正在工作! ssh do_something > file.txt |而 [ $CUR -lt $MAX ];做 CUR=sed -n '2p' &lt; spray.txt | wc -m;回声 -ne "$CUR %" \\r;睡觉1;完成
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-14
相关资源
最近更新 更多