You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用until循环实现cURL断点续传?该方案是否更健壮?(Zsh环境)

cURL断点续传自动重试的until循环实现(Zsh环境)

原while循环方案回顾

Juan Nunez-Iglesias在2013年提出的自动恢复中断下载的脚本如下:

export ec=18; while [ $ec -eq 18 ]; do curl -O -C - http://site.xyz/file.zip; export ec=$?; done

该脚本仅针对cURL中断下载时的退出码18进行重试,其中-O用于保留远程文件名,-C -实现断点续传。

Helder提出的until循环实现

在Zsh环境中,until循环的实现方式简洁直接:

until curl -O -C - http://site.xyz/file.zip; do :; done

逻辑说明

until循环的核心特性是直到命令执行成功(退出码为0)才终止循环。其中curl -O -C -的作用与原方案一致:

  • -O:将下载文件保存为远程服务器上的同名文件
  • -C -:让curl自动检测本地已下载文件的大小,从断点位置继续下载

健壮性分析

  1. 覆盖范围更广:原while方案仅针对退出码18(部分网络中断场景)重试,而until方案会对所有非0退出码的失败情况重试,包括临时网络连接失败、DNS解析超时等更多场景。
  2. 存在过度重试风险:这一点和Juan提到的while [ $ec -ne 0 ]类似——如果遇到不可恢复的错误(比如目标文件不存在、权限不足),脚本会无限重试,这显然不合理。
  3. 场景适配性:
    • 若你的下载故障仅为临时网络中断,原方案更精准,可避免无效重试;
    • 若需要覆盖更多临时故障场景,until方案更全面,但建议补充重试次数限制或针对可恢复退出码的判断,比如:
      max_retries=5
      retry_count=0
      until curl -O -C - http://site.xyz/file.zip || [ $retry_count -ge $max_retries ]; do
          retry_count=$((retry_count+1))
          sleep 2
      done
      

Zsh环境测试方法

  • 断点续传测试:手动运行curl -O -C - http://site.xyz/file.zip,中途按Ctrl+C中断,再执行until脚本,观察curl是否从已下载的位置继续。
  • 自动重试测试:断开网络后运行until脚本,查看是否会反复尝试连接,恢复网络后是否自动完成下载。
  • 异常场景测试:使用一个不存在的URL(比如http://example.com/nonexist.zip),观察脚本是否会无限重试,验证过度重试的问题。

内容的提问来源于stack exchange,提问作者user26614668

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:56