如何用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自动检测本地已下载文件的大小,从断点位置继续下载
健壮性分析
- 覆盖范围更广:原while方案仅针对退出码18(部分网络中断场景)重试,而until方案会对所有非0退出码的失败情况重试,包括临时网络连接失败、DNS解析超时等更多场景。
- 存在过度重试风险:这一点和Juan提到的
while [ $ec -ne 0 ]类似——如果遇到不可恢复的错误(比如目标文件不存在、权限不足),脚本会无限重试,这显然不合理。 - 场景适配性:
- 若你的下载故障仅为临时网络中断,原方案更精准,可避免无效重试;
- 若需要覆盖更多临时故障场景,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
相关产品推荐
相关产品推荐

