Comment diriger ou rediriger la sortie de curl -v?


117

Pour une raison quelconque, la sortie est toujours imprimée sur le terminal, que je la redirige via 2> ou> ou |. Y a-t-il un moyen de contourner ceci? Pourquoi cela arrive-t-il?


3
Si je le fais curl -v url 2>&1, les erreurs sont correctement redirigées vers la sortie standard pour moi.
Josh Lee

Réponses:


134

ajoutez l' -soption (silent) pour supprimer la jauge de progression, puis redirigez stderr vers stdout pour obtenir une sortie détaillée sur le même fd que le corps de la réponse

curl -vs google.com 2>&1 | less

3
Cela fonctionne pour la plupart des sites Web, mais pour une raison quelconque, le serveur local de ma machine imprime toujours la sortie complète, même si je fais `2> & 1 | grep asdfasdfasdfasdfdfs` ou quelque chose de ce genre. La sortie complète, y compris les en-têtes, est toujours affichée sur la console. Y a-t-il un autre flux que je peux diriger vers grep pour extraire certaines données dont j'ai besoin?
jonderry

Quelles informations essayez-vous réellement d'extraire et quelles informations voulez-vous jeter. J'ai compris votre question comme signifiant que vous voulez que toute la sortie de -v soit dirigée vers stdout.
SingleNegationElimination

Je veux traiter certains des cookies (en gros, grep certaines informations des cookies et faire d'autres choses). Oui, je veux que tout aille sur std, afin que je puisse traiter ce que je veux via des tuyaux. Actuellement, une partie de la sortie s'affiche simplement sur la console et semble impossible à rediriger et je ne sais pas pourquoi.
jonderry

Pouvez-vous publier une capture d'écran de la sortie apparaissant à l'écran que vous souhaitez capturer? Je ne sais pas quel type de sortie vous pourriez éventuellement voir et qui pourrait éventuellement manquer 2>&1.
SingleNegationElimination

C'est juste le même type de sortie qu'avec n'importe quel autre site Web. La seule différence est que le serveur s'exécute localement. Existe-t-il un moyen pour un programme d'imprimer sur la console sans que ce texte ne soit capturé par stout / sterr?
jonderry

115

Votre URL contient probablement des esperluettes. J'ai eu ce problème aussi et j'ai réalisé que mon URL était pleine d'esperluettes (des variables CGI étant passées) et que tout était donc envoyé en arrière-plan d'une manière étrange et ne redirigeait donc pas correctement. Si vous mettez des guillemets autour de l'URL, cela le corrigera.


1
J'ai eu le même problème. Pas besoin de 2> & 1 pour que je puisse garder la sortie et le journal de connexion séparés. Merci roadnottaken.
quornian

3
Love Stack-O ... J'ai trouvé ce q, et la mention d'esperluette dans l'URL. Il a mis des citations autour du mien et le problème a été résolu.
Paulb

2
Les citations ont fait l'affaire pour moi. J'avais l'impression que curl s'exécutait dans d'autres threads. Merci beaucoup !
vdolez

1
J'ai dû chercher sur le Web pendant cinq minutes avant de sauver ma soirée :)
Shautieh

Jésus, quel terrible bug de curl - au moins il devrait échouer ou donner un avertissement. Votre réponse de 2012 m'a aidé en 2018. Il m'a fallu 30 minutes pour résoudre ce problème jusqu'à ce que je trouve votre réponse. Je vous remercie!
Mauvis Ledford

29

La réponse ci-dessus n'a pas fonctionné pour moi, ce qui a finalement été cette syntaxe:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee met la sortie à l'écran, mais l'ajoute également à mon journal.


1
&> /dev/stdoutétait définitivement la partie manquante, merci
mattspain

10

Si vous avez besoin de la sortie dans un fichier, vous pouvez utiliser une redirection:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

Assurez-vous de ne pas retourner le >curl-output.txtet 2>&1, ce qui ne fonctionnera pas en raison du comportement de redirection de bash .


3

J'ai trouvé la même chose: curl par lui-même serait imprimé sur STDOUT, mais ne pouvait pas être redirigé vers un autre programme.

Au début, je pensais l'avoir résolu en utilisant xargs pour faire écho à la sortie en premier:

curl -s ... <url> | xargs -0 echo | ...

Mais alors, comme indiqué dans les commentaires, cela fonctionne également sans la partie xargs, donc -s(mode silencieux) est la clé pour empêcher une sortie de progression étrangère vers STDOUT:

curl -s ... <url> | perl  -ne 'print $1 if /<sometag>([^<]+)/'

L'exemple ci-dessus récupère le <sometag>contenu simple (ne contenant aucune balise incorporée) de la sortie XML de l'instruction curl.


2
dans vos exemples, le 'xargs -0 echo |' est inutile. Tant que vous avez «curl -s», vous pouvez diriger la sortie vers un autre programme.
Ryan Horrisberger

1

Juste mes 2 cents. La commande ci-dessous devrait faire l'affaire, comme répondu précédemment

curl -vs google.com 2>&1

Cependant, si besoin d'obtenir la sortie dans un fichier,

curl -vs google.com > out.txt 2>&1

devrait marcher.


1
Cela n'ajoute aucune valeur réelle à la réponse acceptée de 2011. Au contraire, cela pourrait être un commentaire à cette réponse.
trincot

0

Ce qui suit a fonctionné pour moi:

Mettez votre instruction curl dans un script nommé abc.sh

Maintenant, exécutez:

sh abc.sh 1>stdout_output 2>stderr_output

Vous obtiendrez les résultats de votre curl stdout_outputet les informations de progression stderr_output.


0

Cet exemple simple montre comment capturer la sortie curl et l'utiliser dans un script bash

test.sh

function main
{
  \curl -vs 'http://google.com'  2>&1
  # note: add -o /tmp/ignore.png if you want to ignore binary output, by saving it to a file. 
}

# capture output of curl to a variable
OUT=$(main)

# search output for something using grep.
echo
echo "$OUT" | grep 302 
echo
echo "$OUT" | grep title 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.