以下是Juan Nunez-Iglesias在 2013 年发表的博客文章中介绍的如何让 cURL 自动恢复中断的下载的解决方案:
export ec=18; while [ $ec -eq 18 ]; do curl -O -C - http://site.xyz/file.zip; export ec=$?; done
它已在这里和 Stack Overflow 上发布过多次,包括原始版本和while
循环内部的细微更改。
循环内部的改变while
是由不同的人引入的,以使脚本更加健壮。
- “下载中断时 curl 的退出代码是 18,它
$?
会返回 bash 中最后一个命令的退出代码。因此,在退出代码为 18 时,请继续尝试下载文件,保留文件名 (-O
) 并从上一次下载中断的地方继续 (-C
)。” - Juan Nunez-Iglesias - “正如 Jan 在评论中指出的那样,根据下载出现的问题,您的错误代码可能会有所不同。只需将 18 更改为您看到的任何错误,即可让它为您工作!(如果您喜欢冒险,您可以将条件更改为
while [ $ec -ne 0 ]
,但这感觉就像在 Python 中使用了裸露的 except,这很糟糕。;)” - Juan Nunez-Iglesias - “在我的例子中,curl 使用不同的代码退出,因此我改为检查成功代码:
while [ $ec -ni 0 ]
” - Ilya Belsky,此处
3 月份,Helder Magalhães 建议将while
Juan 原版中的循环替换为until
:
until
此解决方案可以使用unstead进一步简化。请参阅相关线程。
虽然我不太擅长使用 cURL 或 shell 脚本,但我会尝试自己编写,但是自己编写的问题不在于脚本本身,而在于缺乏对如何正确测试它的理解。
有人能演示如何实现 Helder 的想法吗?它真的能让脚本更强大吗?
我使用 Zsh。
您实际上不需要进行所有的导出和检查。您只需使用:
一些可能有帮助的背景信息。
你原来的代码,如果
curl
失败,它将返回 18,并会不断循环,直到它不等于 18。上述解决方案本质上是循环执行
until
成功,而不是监控失败。为了使使用退出代码更加可行,您需要考虑更复杂的程序。因为,即使使用while !
,您也可以轻松地使用&&
和||
作为下一个成功或失败条件。例如:
与以下内容完全相同:
使用分配变量和检查退出代码需要更多的复杂性,否则它实际上只是过度了。