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 stdout
comme ç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
-s
était la clé!-s
sans-v
vous 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.curl
àjq
. Aucune barre de progression sans tuyauterie versjq
, puis lorsquejq
je tuyaute vers, je dois revenir en arrière et ajouter-s
.STDOUT
n'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.Cela supprimera la boîte de dialogue d'état, mais sinon, les erreurs seront envoyées à STDERR.
Ce qui précède affiche la table d’état lors d’une redirection.
Ce qui précède supprime la table d’état lors de la redirection, mais les erreurs iront quand même à STDERR.
Ce qui précède est un exemple d'erreur dans STDERR.
Ajoutez simplement 2> & 1 à la fin pour rediriger STDERR vers STDOUT (dans ce cas, vers un fichier).
la source
Selon
man curl
:Exemple d'utilisation:
ou si vous voulez capturer le HTTP-BODY dans une variable en bash
Vous pouvez utiliser
-s
ou--silent
interchangeable.la source
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
isatty
qui indique si oui ou non un descripteur de fichier fait référence à un terminal.la source
[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
depuis la page de manuel curl
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.
depuis la page de manuel curl
la source
Pour mettre des messages d'erreur réels quelque part, vous devez écrire strerr dans un fichier journal. Quelque chose comme ca:
la source
É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')"
la source