web-dev-qa-db-fra.com

Comment puis-je diriger ou rediriger la sortie de curl -v?

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

101
jonderry

ajouter le -s option (silencieuse) pour supprimer la jauge de progression, puis rediriger 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
111

Votre URL contient probablement des esperluettes. J'avais aussi ce problème et je me suis rendu compte que mon URL était pleine d'esperluettes (à partir de variables CGI passées) et que tout était envoyé en arrière-plan de manière étrange et ne redirigeait donc pas correctement. Si vous mettez des guillemets autour de l'URL, cela le résoudra.

103
roadnottaken

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 affiche la sortie à l'écran, mais l'ajoute également à mon journal.

24
Amir Mehler

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.txt et 2>&1, qui ne fonctionnera pas à cause de comportement de redirection de bash .

5
panepeter

J'ai trouvé la même chose: curl imprimerait lui-même sur STDOUT, mais ne pourrait pas être inséré dans un autre programme.

Au début, je pensais avoir résolu le problème en utilisant xargs pour faire écho à la sortie:

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 toute sortie de progression superflue vers STDOUT:

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

L'exemple ci-dessus saisit le simple <sometag> contenu (ne contenant pas de balises incorporées) à partir de la sortie XML de l'instruction curl.

3
Brent Faust

Ce qui suit a fonctionné pour moi:

Mettez votre déclaration curl dans un script nommé abc.sh

Maintenant, lancez:

sh abc.sh 1>stdout_output 2>stderr_output

Vous obtiendrez les résultats de votre boucle en stdout_output et les informations de progression dans stderr_output.

0
amit

Cet exemple simple montre comment capturer une 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 
0
Brad Parks