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?
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
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.
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.
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:
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
curl -v url 2>&1
, les erreurs sont correctement redirigées vers la sortie standard pour moi.Réponses:
ajoutez l'
-s
option (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éponsela source
2>&1
.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.
la source
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.
la source
&> /dev/stdout
était définitivement la partie manquante, merciSi vous avez besoin de la sortie dans un fichier, vous pouvez utiliser une redirection:
Assurez-vous de ne pas retourner le
>curl-output.txt
et2>&1
, ce qui ne fonctionnera pas en raison du comportement de redirection de bash .la source
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:
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: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.la source
Juste mes 2 cents. La commande ci-dessous devrait faire l'affaire, comme répondu précédemment
Cependant, si besoin d'obtenir la sortie dans un fichier,
devrait marcher.
la source
Ce qui suit a fonctionné pour moi:
Mettez votre instruction curl dans un script nommé
abc.sh
Maintenant, exécutez:
Vous obtiendrez les résultats de votre curl
stdout_output
et les informations de progressionstderr_output
.la source
Cet exemple simple montre comment capturer la sortie curl et l'utiliser dans un script bash
test.sh
la source