Aqui está uma solução sobre como fazer o cURL retomar automaticamente downloads interrompidos, da postagem do blog de 2013 de Juan Nunez-Iglesias :
export ec=18; while [ $ec -eq 18 ]; do curl -O -C - http://site.xyz/file.zip; export ec=$?; done
Foi postado diversas vezes aqui e no Stack Overflow, tanto na versão original quanto com pequenas alterações dentro do while
loop.
As mudanças dentro do while
loop foram introduzidas por pessoas diferentes para tornar o script mais robusto.
- "O código de saída que o curl chucks exibe quando um download é interrompido é 18, e
$?
fornece o código de saída do último comando no bash. Então, enquanto o código de saída for 18, continue tentando baixar o arquivo, mantendo o nome do arquivo (-O
) e continuando de onde o download anterior parou (-C
)." - Juan Nunez-Iglesias - "Como Jan aponta nos comentários, dependendo do que está errado com o download, seu código de erro pode ser diferente. Basta alterar 18 para qualquer erro que você esteja vendo para fazê-lo funcionar para você! (Se você estiver se sentindo aventureiro, você pode alterar a condição para
while [ $ec -ne 0 ]
, mas isso parece usar um except simples em Python, o que é ruim. ;)" - Juan Nunez-Iglesias - "No meu caso, o curl sai com códigos diferentes, então eu verifico o código de sucesso:
while [ $ec -ni 0 ]
" - Ilya Belsky, aqui
Em março, Helder Magalhães sugeriu substituir o while
loop na versão original de Juan por until
:
Esta solução pode ser ainda mais simplificada usando
until
unstead. Veja thread relacionada .
Embora eu não seja muito bom em usar cURL ou scripts de shell, eu tentaria escrevê-los eu mesmo, mas o problema de escrevê-los eu mesmo não é o script em si, mas a falta de compreensão de como testá-lo corretamente.
Alguém poderia mostrar como implementar a ideia do Helder? E isso realmente torna o script mais robusto?
Eu uso Zsh.
Você realmente não precisa de toda a exportação e verificação. Você pode usar apenas:
Algum contexto que pode ajudar.
Se seu código original
curl
falhar, ele retornará 18 e fará um loop contínuo até que não seja igual a 18.A solução acima é essencialmente fazer um loop
until
para o sucesso em vez de monitorar sua falha. Para tornar o uso de códigos de saída mais viável, você precisa de um programa mais complexo em mente. Porque, mesmo com owhile !
, você pode facilmente usar&&
and||
para o próximo sucesso ou falha condicional.Por exemplo:
é exatamente a mesma coisa que:
É preciso mais complexidade para usar a atribuição de variáveis e verificar códigos de saída, ou será realmente um exagero.