Estou usando curl
para baixar um arquivo zip. curl
é chamado a partir de um bash
script:
curl --user joedoe http://1.2.3.4/files/joedoe.zip -o /tmp/downloaded.zip
Eu gostaria de detectar quando o arquivo zip de destino não existe.
eu tentei
if ! [[ $? == 0 ]] ; then
echo "ERROR: problem with Curl."
exit 1
fi ;
mas parece que $?
retornado por curl
is 0
, então não consigo detectar quando os arquivos zip não existem.
Como pode ser feito?
Isso é quase uma duplicata de Posso fazer o cURL falhar com um exitCode diferente de 0 se o código de status HTTP não for 200? A resposta mais votada (ou seja, mais votada quando estou escrevendo isso) aconselha
-f
. Esta solução irá capturar4xx
ou5xx
códigos de erro HTML, mas não301 Moved Permanently
. No seu caso, o código de erro HTML pode ou não ser301
.Se eu fosse você, capturaria e analisaria esse código. Felizmente, você
curl
usa-o
e grava em um arquivo normal, não em stdout; para que possamos usar stdout para nossa tarefa extra.-w
é o que você precisa:Agora você tem
$exit_status
e$http_code
analisar. Decida se você quer-f
e construa a lógica do seu script de acordo. Basicamente você quer$http_code
ser200
. Mesmo se for200
, verifique de qualquer maneira se$exit_status
for0
. Imagine que o link é bom, mas você não pode escrever/tmp/downloaded.zip
(talvez alguém tenha colocado um arquivo não autorizado lá na esperança de que você o use). Este é um exemplo de caso em que você pode obter200
do servidor e ainda um erro (diferente de zero$exit_status
) decurl
.Mesmo se
$exit_status
is0
e$http_code
is200
, você ainda pode querer verificar se/tmp/downloaded.zip
é um arquivo zip válido. Um teste básico pode ser o status de saída de:(se o seu
file
suporta essas opções). Um teste "completo" é verificar o status de saída de: