web-dev-qa-db-fra.com

cURL: comment supprimer les sorties étranges lors d'une redirection?

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

58
Ian Mackinnon

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.

54
Dennis Williamson
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).

20
mhoydis

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.

5
Venkatt Guhesan

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.

4
Ian Mackinnon

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.

2
Wyrmwood

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
1
user1065951

É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') "

0
VeggieVampire