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?
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
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.
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.
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 .
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.
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
.
Cet exemple simple montre comment capturer une sortie curl et l'utiliser dans un script bash
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