Quiero que un script se convierta en un archivo y coloque el código de estado en una variable (o al menos me permita probar el código de estado)
Puedo ver que puedo hacerlo en dos llamadas con, por ejemplo
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 ...
¿Pero presumiblemente hay una manera de evitar la llamada adicional redundante?
$?
no ayuda: el código de estado 404 todavía recibe un código de retorno de 0
Respuesta1
#!/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"
(Hay otras formas, como --write-out
con un archivo temporal. Pero en mi ejemplo no es necesario tocar el disco para escribir ningún archivo temporal y recordar eliminarlo; todo se hace en la RAM)
Respuesta2
Usar --write-out y un archivo temporal me llevó 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
Respuesta3
Desde curl 7.76.0 existe una opción para hacer esto sin la llamada adicional,--caída-con-cuerpo
curl -sI --fail-with-body $url
Curl fallará con el código 22 si la solicitud devuelve cualquier código de estado HTTP superior a 400, pero devolverá el cuerpo independientemente del código de estado.