Мне нужен скрипт для сохранения в файл и помещения кода состояния в переменную (или, по крайней мере, позволяющий мне проверить код состояния)
Я вижу, что могу сделать это в два вызова, например,
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 ...
но, вероятно, есть способ избежать лишнего дополнительного звонка?
$?
не помогает: код состояния 404 все равно возвращает код возврата 0
решение1
#!/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"
(Есть и другие способы, например, --write-out
во временный файл. Но в моем примере не нужно прикасаться к диску, чтобы записать какой-либо временный файл и помнить о его удалении; все делается в оперативной памяти)
решение2
Использование --write-out и временного файла дало мне следующее:
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
решение3
Начиная с curl 7.76.0 появилась возможность сделать это без дополнительного вызова,--падение-в-объединении-с-телом
curl -sI --fail-with-body $url
Curl завершится ошибкой с кодом 22, если запрос вернет любой код статуса HTTP выше 400, но вернет тело запроса независимо от кода статуса.