Quero que um script se transforme em um arquivo e coloque o código de status em uma variável (ou, pelo menos, permita-me testar o código de status)
Posso ver que posso fazer isso em duas chamadas, por exemplo
url=https://www.gitignore.io/api/nonexistentlanguage
x=$(curl -sI $url | grep HTTP | grep -oe '\d\d\d')
if [[ $x != 200 ]] ; then
echo "$url SAID $x" ; return
fi
curl $url # etc ...
mas provavelmente há uma maneira de evitar a chamada extra redundante?
$?
não ajuda: o código de status 404 ainda recebe um código de retorno 0
Responder1
#!/bin/bash
URL="https://www.gitignore.io/api/nonexistentlanguage"
response=$(curl -s -w "%{http_code}" $URL)
http_code=$(tail -n1 <<< "$response") # get the last line
content=$(sed '$ d' <<< "$response") # get all but the last line which contains the status code
echo "$http_code"
echo "$content"
(Existem outras formas como --write-out
um arquivo temporário. Mas meu exemplo não precisa tocar no disco para gravar qualquer arquivo temporário e lembrar de excluí-lo; tudo é feito na RAM)
Responder2
Usar --write-out e um arquivo temporário me levou a:
url="https://www.gitignore.io/api/$1"
tempfile=$(mktemp)
code=$(curl -s $url --write-out '%{http_code}' -o $tempfile)
if [[ $code != 200 ]] ; then
echo "$url SAID $code"
rm -f $tempfile
return $code
fi
mv $tempfile $target
Responder3
Desde o curl 7.76.0, existe uma opção para fazer isso sem a chamada extra,--queda-com-corpo
curl -sI --fail-with-body $url
Curl falhará com o código 22 se a solicitação retornar qualquer código de status HTTP acima de 400, mas retornará o corpo independentemente do código de status.