cURL: come eliminare strani output durante il reindirizzamento?


67

Sto provando a stampare solo le sezioni dettagliate di una richiesta cURL (che vengono inviate stderr) dalla shell bash.

Ma quando reindirizzo in stdoutquesto modo:

curl -v http://somehost/somepage > /dev/null

Una sorta di tabella dei risultati appare nel mezzo dell'output per stderr:

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0

Seguito da questo verso la fine:

{ [data not shown]
118   592    0   592    0     0  15714      0 --:--:-- --:--:-- --:--:-- 25739

Ciò rende le intestazioni di risposta meno leggibili.

Non vedo questo testo quando non si reindirizza.


Un altro modo per vedere gli effetti:

La tabella non viene visualizzata:

curl -v http://somehost/somepage 2>&1

La tabella appare:

curl -v http://somehost/somepage 2>&1 | cat

1) Come mai questo si presenta solo con determinati tipi di reindirizzamenti?

2) Qual è il modo più accurato per sopprimerlo?

Grazie

Risposte:


60

Prova questo:

curl -vs -o /dev/null http://somehost/somepage 2>&1

Che sopprimerà la barra di avanzamento, di inviare stdoutper /dev/nulle reindirizzamento stderr(l' -voutput) a stdout.


32
Grazie, è -sstata la chiave!
Ian Mackinnon,

6
@IanMackinnon Nota che con -sma senza di -vte non vedrai errori come la mancata connessione. Per questo dovresti anche aggiungere -S(o --show-error) come nella risposta di mhoydis.
Artyom,

ma perché la barra di avanzamento appare solo in primo luogo quando si reindirizza? Mi sono imbattuto in questo stesso problema quando il piping dell'output di curla jq. Nessuna barra di avanzamento senza connessione a jq, quindi quando eseguo il piping a jqdevo tornare indietro e aggiungere -s.
sixty4bit

@ sixty4bit: questa è una scelta di design fatta dagli sviluppatori. Il programma può rilevare quando STDOUTnon è un tty. Quando l'output non viene convogliato, non si desidera che le informazioni sull'avanzamento siano intervallate dall'output normale, che è possibile visualizzare e avere un'idea dei progressi. Quando l'output viene reindirizzato o reindirizzato, non è possibile visualizzarlo in modo da non disporre di un indicatore di avanzamento, a meno che la barra di avanzamento non sia attivata.
Dennis Williamson,

23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Ciò eliminerà la finestra di dialogo sullo stato, ma altrimenti genererà errori su STDERR.

user@host:~# curl http://www.yahoo.com > /dev/null
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  254k    0  254k    0     0   403k      0 --:--:-- --:--:-- --:--:--  424k

Quanto sopra mostra la tabella di stato durante il reindirizzamento.

user@host:~# curl --fail --silent --show-error http://www.yahoo.com > /dev/null

Quanto sopra sopprime la tabella di stato durante il reindirizzamento, ma gli errori andranno comunque a STDERR.

user@host:~# curl --fail --silent --show-error http://www.errorexample.com > /dev/null
curl: (6) Couldn't resolve host 'www.errorexample.com'

Quanto sopra è un esempio di errore a STDERR.

user@host:~# curl -v --fail --silent --show-error http://www.errorexample.com > ~/output.txt 2>&1
user@host:~# cat ~/output.txt 
* getaddrinfo(3) failed for www.errorexample.com:80
* Couldn't resolve host 'www.errorexample.com'
* Closing connection #0
curl: (6) Couldn't resolve host 'www.errorexample.com'

Aggiungi 2> & 1 alla fine per reindirizzare STDERR su STDOUT (in questo caso, su un file).


5

Secondo man curl:

-s, --silent : Silent or quiet mode. Don't show progress meter or error messages. Makes Curl mute.

Esempio di utilizzo:

curl -s 'http://www.google.com'

o se vuoi catturare HTTP-BODY in una variabile in bash

BODY=$( curl -s 'http://www.google.com' )
echo $BODY

È possibile utilizzare -so in modo --silentintercambiabile.


4

Con riferimento alla domanda 1 ( come cURL sa visualizzare la tabella solo quando l'output viene reindirizzato), non mi rendevo conto che un programma potesse dire che i suoi output erano diretti, ma sembra che sui sistemi POSIX sia presente una funzione isattyche segnala se un descrittore di file fa riferimento a un terminale.


2
Ecco uno snippet di Bash:[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
Dennis Williamson,

2

1) Come mai questo si presenta solo con determinati tipi di reindirizzamenti?

dalla pagina man di curl

Se si desidera un indicatore di avanzamento per richieste POST o PUT HTTP, è necessario reindirizzare l'output della risposta su un file, utilizzando il reindirizzamento della shell (>), -o [file] o simile.

curl deve usare isatty per determinare il reindirizzamento e stampa l'indicatore di avanzamento quando reindirizzato a un file o una shell shell.

2) Qual è il modo più accurato per sopprimerlo?

dalla pagina man di curl

-s, --silent

Modalità silenziosa o silenziosa. Non mostrare lo stato di avanzamento o i messaggi di errore. Rende il ricciolo muto. Produrrà comunque i dati richiesti, potenzialmente anche al terminale / stdout a meno che non li reindirizzi.


1

Per inserire messaggi di errore reali da qualche parte, è necessario scrivere strerr in un file di registro. Qualcosa del genere:

curl  "http://domain.name/process" --stderr /var/log/curl_err.log > /dev/null

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.