web-dev-qa-db-fra.com

Comment curl imprime-t-il sur le terminal pendant le raccordement

Lorsque je curl un fichier et que je le dirige vers un fichier ou une autre commande, la sortie s'affiche dans mon terminal. Je ne suis pas sûr de savoir comment cela se produit, car le tuyau est censé tirer tout le tour de curl, non?

Par exemple:

$ curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  129M    0  129M    0     0  22.5M      0 --:--:--  0:00:05 --:--:-- 24.7M

Modifier

J'utilise curl comme ceci:

curl http://www.archive.org/stream/Pi_to_100000000_places/pi.txt | some_other_command > some_file

Je ne veux pas diriger le statut vers une autre commande, je me demandais simplement comment il était capable d'afficher le statut. Cependant, montrant comment rediriger les deux flux ajoutés à la réponse, ne le supprimez pas.

4
vikarjramun

Deux flux de sortie sont généralement disponibles: la sortie standard et l'erreur standard. En pratique, lors de l'exécution dans un terminal, les deux envoient des données au terminal. > ne redirige que la sortie standard et curl imprime les données de progression sur l'erreur standard. Pour supprimer les deux, utilisez l'un des éléments suivants:

curl ... > /dev/null 2>&1
curl ... &> /dev/null    # bash's combined redirection operator
curl -s ...    # -s, --silent: Silent or quiet mode. Don't show progress meter or error messages.

Pour envoyer les deux à un tuyau:

curl ... 2>&1 | ...
curl |& ...    # bash's combined pipe

Sauf si vous utilisez les opérateurs |& ou &>, tous les flux sont redirigés indépendamment.

Regarde aussi:

7
muru

Lorsque vous utilisez curl pour ouvrir une URL, vous obtenez deux résultats:

  1. Le statut de curl lui-même.
  2. Le contenu de cette URL.

Curl devrait utiliser un moyen de montrer ces deux séparément, sans quoi le traitement de la sortie réelle (le contenu de l'URL) serait difficile et je finirais par avoir des contenus inutiles (statut de curl).

Donc, il utilise stderr pour son statut et stdout pour le contenu.

En utilisant >, vous redirigez le contenu de l'URL (stdout) vers le /dev/null, vous devriez en fait utiliser: 2> /dev/null à la place.

Aussi, si vous voulez pépiner les deux à la prochaine commande:

curl url |&  command

Si vous voulez seulement que le contenu soit redirigé vers la commande suivante sans voir l'état:

curl 2> /dev/null | command
2
Ravexina