【问题标题】:echo "." until command finishes executing [duplicate]回声“。”直到命令完成执行[重复]
【发布时间】:2015-04-06 02:21:28
【问题描述】:

我目前正试图弄清楚如何让 bash 在屏幕上绘制一系列点(有点像进度指示器),直到命令完成执行。例如,假设我想为 wget 下载画点:

wget -s http://url.tar.gz
until "above command has finished executing"; do
    echo -n "."
    sleep 0.05s
done

我可以使用“$!”吗?或“$?”帮助解决这个问题?

感谢您的帮助!

【问题讨论】:

  • @Squirrel 他不想获取退出码,他想检测后台进程是否还在运行。
  • 你为什么不直接使用wget的内置进度指示器?
  • 我标记它是因为问题正文(而不是标题)实际上提出了这个确切的问题,而最重要的答案实际上有代码显示了如何做到这一点。
  • @Barmar 我不想使用 wget 的内置进度条,因为我可以更轻松地在可能没有任何进度指示器的不同可执行文件之间复制点。

标签: linux bash


【解决方案1】:

这将打印点直到wget 完成:

while sleep 0.1; do printf "."; done &
wget -q http://url.tar.gz
kill $!
echo "Finished"

wget 有自己的进度指示器。以上使用-q 将其关闭。

$! 扩展为在后台执行的最后一个进程的 PID,在这种情况下,它是打印点的while 循环。因此,kill $! 停止循环,结束点的打印。

【讨论】:

    【解决方案2】:

    感谢松鼠,我能够解决这个问题。他将我指向一个我复制的线程shell - get exit code of background process。通过将以下内容添加到我的脚本中,我能够让它按我希望的方式工作:

    wget -q http://url.example.com.tar.bz2 &
    wget_pid=$!
    
    while [ -d /proc/$wget_pid ]; do
        echo -n "."
        sleep 0.01s
    done
    

    【讨论】:

    • 按照编码,直到 wget 完成后才会进入 while 循环。为了将while 循环输入为wget 正在检索文件,您需要在wget 命令中附加一个& 符号&,例如:wget -q http://url.example.com.tar.bz2 &
    • 我一定忘了加上那个“&”。感谢您指出这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2013-09-01
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多