Si vous voulez capturer le code d'état HTTP dans une variable, mais rediriger toujours le contenu vers STDOUT, vous devez créer deux STDOUT. Vous pouvez le faire avec la substitution de processus >() et la substitution de commande $().
Tout d'abord, créez un descripteur de fichier 3
pour le STDOUT de votre processus actuel avec exec 3>&1
.
Ensuite, utilisez l'option -o
de curl pour rediriger le contenu de la réponse vers un fifo temporaire en utilisant la substitution de commande, puis dans cette substitution de commande, redirigez la sortie vers le descripteur de fichier STDOUT de votre processus actuel 3
avec -o >(cat >&3)
.
En mettant tout cela ensemble dans bash
3.2.57(1)-release
(standard pour macOS
) :
# crée un nouveau descripteur de fichier 3 qui redirige vers 1 (STDOUT)
exec 3>&1
# Exécute curl dans une commande séparée, capturant la sortie de -w "%{http_code}" dans HTTP_STATUS
# et envoyant le contenu à STDOUT de cette commande avec -o >(cat >&3)
HTTP_STATUS=$(curl -w "%{http_code}" -o >(cat >&3) 'http://example.com')
Notez que cela ne fonctionne pas dans /bin/sh
comme SamK l'a noté dans les commentaires ci-dessous.
0 votes
Pour ma part, je peux voir dans le manuel comment obtenir le code de statut HTTP, mais l'option -w ne fonctionne pas. J'ai signalé le bug à Apple.
71 votes
Le drapeau
-i
, comme danscurl -i https://www.example.com/
, est probablement ce que vous voulez, selon superuser.com/a/514798/1901880 votes
Pourquoi ne pas simplement quelque chose comme
curl -IL http://www.example.com | grep "^HTTP\/"
?11 votes
Ne pas oublier à ton futur toi-même : la réponse que tu veux est probablement celle de Cyril David (actuellement en 4ème position)