J'essaie d'imprimer uniquement les sections verbeuses d'une demande cURL (qui sont envoyées à stderr
) à partir du shell bash.
Mais quand je redirige stdout
comme ceci:
curl -v http://somehost/somepage > /dev/null
Une sorte de tableau de résultats apparaît au milieu de la sortie avec stderr
:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Suivi par ceci vers la fin:
{ [data not shown]
118 592 0 592 0 0 15714 0 --:--:-- --:--:-- --:--:-- 25739
Ce qui rend les en-têtes de réponse moins lisibles.
Je ne vois pas ce texte quand je ne le redirige pas.
Une autre façon de voir les effets:
Le tableau n'apparaît pas:
curl -v http://somehost/somepage 2>&1
Le tableau apparaît:
curl -v http://somehost/somepage 2>&1 | cat
1) Comment cela se produit-il uniquement avec certains types de redirections?
2) Quel est le meilleur moyen de le supprimer?
Je vous remercie
Essaye ça:
curl -vs -o /dev/null http://somehost/somepage 2>&1
Cela supprimera la jauge de progression, enverra stdout
à /dev/null
et rediriger stderr
(la sortie -v
) vers stdout
.
curl --fail --silent --show-error http://www.example.com/ > /dev/null
Cela supprimera la boîte de dialogue d'état, mais sinon, les erreurs seront envoyées à STDERR.
user@Host:~# curl http://www.yahoo.com > /dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 254k 0 254k 0 0 403k 0 --:--:-- --:--:-- --:--:-- 424k
Ce qui précède affiche la table d’état lors de la redirection.
user@Host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null
Ce qui précède supprime la table d’état lors de la redirection, mais les erreurs iront quand même à STDERR.
user@Host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve Host 'www.errorexample.com'
Ce qui précède est un exemple d'erreur dans STDERR.
user@Host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@Host:~# cat ~/output.txt
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve Host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve Host 'www.errorexample.com'
Ajoutez simplement 2> & 1 à la fin pour rediriger STDERR vers STDOUT (dans ce cas, vers un fichier).
Selon man curl
:
-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.
Exemple d'utilisation:
curl -s 'http://www.google.com'
ou si vous voulez capturer le HTTP-BODY dans une variable en bash
BODY=$( curl -s 'http://www.google.com' )
echo $BODY
Vous pouvez utiliser -s
ou --silent
de manière interchangeable.
En ce qui concerne la question 1 ( comment cURL sait afficher uniquement le tableau lorsque la sortie est redirigée), je n’avais pas réalisé qu'un programme pouvait indiquer que ses résultats étaient dirigés, mais il semble que sur les systèmes POSIX, il existe une fonction isatty
qui indique si un descripteur de fichier fait ou non référence à un terminal.
1) Comment cela se produit-il uniquement avec certains types de redirections?
depuis la page de manuel curl
Si vous souhaitez un indicateur de progression pour les demandes HTTP POST ou PUT, vous devez rediriger la sortie de la réponse vers un fichier, à l'aide de la redirection Shell (>), -o [fichier] ou similaire.
curl doit utiliser isatty pour déterminer la redirection et imprime l'indicateur de progression lorsqu'il est redirigé vers un fichier ou un canal Shell.
2) Quel est le meilleur moyen de le supprimer?
depuis la page de manuel curl
- s, --silent
Mode silencieux ou silencieux. Ne pas afficher les indicateurs de progression ou les messages d'erreur. Rend Curl muet. Il transmettra toujours les données que vous demandez, éventuellement même au terminal/stdout, à moins que vous ne les redirigiez.
Pour placer les vrais messages d'erreur quelque part, vous devez écrire stderr dans un fichier journal. Quelque chose comme ca:
curl "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
Étant derrière un proxy, j'utilise une commande comme celle-ci.
date -s "$ (curl --proxy http: // PROXY: 8080 -s http: // google.com --head -s | grep Date | sed 's/Date: // g') "