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

67

J'essaie d'imprimer uniquement les sections verbeuses d'une demande cURL (qui sont envoyées à stderr) depuis le shell bash.

Mais quand je redirige stdoutcomme ça:

curl -v http://somehost/somepage > /dev/null

Une sorte de tableau de résultats apparaît au milieu de la sortie pour 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

Ian Mackinnon
la source

Réponses:

60

Essaye ça:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Cela supprimera le compteur de progression, enverra stdoutà /dev/nullet redirigera stderr(la -vsortie) à stdout.

Dennis Williamson
la source
32
Merci, -sétait la clé!
Ian Mackinnon
6
@IanMackinnon Notez qu'avec ou -ssans -vvous ne verrez pas les erreurs telles que l'échec de la connexion. Pour cela, vous devez également ajouter -S(ou --show-error) comme dans la réponse de mhoydis.
Artyom
mais pourquoi la barre de progression n'apparaît-elle qu'en premier lieu lors de la redirection? Je suis tombé sur ce même problème lorsque la tuyauterie de la sortie curlà jq. Aucune barre de progression sans tuyauterie vers jq, puis lorsque jqje tuyaute vers, je dois revenir en arrière et ajouter -s.
Sixty4bit
@ sixty4bit: C'est un choix de conception fait par les développeurs. Le programme peut détecter quand ce STDOUTn'est pas un tty. Lorsque la sortie n'est pas acheminée, vous ne voulez pas que les informations de progression soient intercalées avec la sortie normale, ce que vous pouvez voir et avoir une idée de la progression. Lorsque la sortie est redirigée ou redirigée, vous ne pouvez pas la voir, vous n'avez donc pas d'indicateur de progression - à moins que la barre de progression ne soit activée.
Dennis Williamson
23
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 d’une 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).

Mhoydis
la source
5

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 -sou --silentinterchangeable.

Venkatt Guhesan
la source
4

En ce qui concerne la question 1 ( comment cURL sait-il n’afficher la table que lorsque la sortie est redirigée), je n’avais pas réalisé qu’un programme pouvait indiquer ses sorties, mais il semble que sur les systèmes POSIX, il existe une fonction isattyqui indique si oui ou non un descripteur de fichier fait référence à un terminal.

Ian Mackinnon
la source
2
Voici un extrait de Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson
2

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 du 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, potentiellement même au terminal / stdout, à moins que vous ne les redirigiez.

Bois de wyrm
la source
1

Pour mettre des messages d'erreur réels quelque part, vous devez écrire strerr dans un fichier journal. Quelque chose comme ca:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null
utilisateur1065951
la source