cURL: Wie kann man seltsame Ausgaben beim Umleiten unterdrücken?

67

Ich versuche, nur die ausführlichen Abschnitte einer cURL-Anforderung (die an gesendet werden stderr) aus der Bash-Shell zu drucken .

Aber wenn ich so umleiten stdout:

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

In der Mitte der Ausgabe wird eine Art Ergebnistabelle angezeigt, um 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

Gefolgt von diesem gegen Ende:

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

Dadurch werden die Antwortheader weniger lesbar.

Ich sehe diesen Text nicht, wenn ich ihn nicht weiterleite.


Ein anderer Weg, um die Auswirkungen zu sehen:

Tabelle erscheint nicht:

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

Tabelle erscheint:

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

1) Wie kommt es, dass dies nur bei bestimmten Arten von Weiterleitungen auftritt?

2) Wie kann man es am besten unterdrücken?

Danke

Ian Mackinnon
quelle

Antworten:

60

Versuche dies:

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

Das wird die Statusanzeige, senden Sie unterdrücken stdoutzu /dev/nullund leitet stderr(die -vAusgabe) an stdout.

Dennis Williamson
quelle
32
Danke, -swar der Schlüssel!
Ian Mackinnon
6
@ IanMackinnon Beachten Sie, dass mit, -saber ohne -v, keine Fehler wie Verbindungsfehler angezeigt werden . Dazu sollten Sie auch -S(oder --show-error) wie in der Antwort von mhoydis hinzufügen .
Artyom
aber warum erscheint der Fortschrittsbalken erst beim Umleiten? Ich bin auf dasselbe Problem gestoßen, als ich die Ausgabe von curlan weitergeleitet habe jq. Kein Fortschrittsbalken ohne Piping zu jq, dann muss jqich beim Piping zu zurückgehen und hinzufügen -s.
29.
@ sixty4bit: Das ist eine Design-Wahl, die die Entwickler getroffen haben. Das Programm kann erkennen, wenn STDOUTes kein tty ist. Wenn die Ausgabe nicht weitergeleitet wird, möchten Sie nicht, dass Fortschrittsinformationen mit der normalen Ausgabe vermischt werden, die Sie sehen und eine Vorstellung vom Fortschritt haben. Wenn die Ausgabe umgeleitet oder weitergeleitet wird, können Sie sie nicht sehen, sodass Sie keine Fortschrittsanzeige haben - es sei denn, der Fortschrittsbalken ist aktiviert.
Dennis Williamson
23
curl --fail --silent --show-error http://www.example.com/ > /dev/null

Dadurch wird der Statusdialog unterdrückt, andernfalls werden Fehler an STDERR ausgegeben.

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

Das obige gibt die Statustabelle bei der Umleitung aus.

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

Das Obige unterdrückt die Statustabelle beim Umleiten, aber Fehler gehen immer noch zu STDERR.

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

Das Obige ist ein Beispiel für einen Fehler bei 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'

Fügen Sie einfach am Ende 2> & 1 hinzu, um STDERR zu STDOUT umzuleiten (in diesem Fall zu einer Datei).

mhoydis
quelle
5

Nach man curl:

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

Anwendungsbeispiel:

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

oder wenn Sie den HTTP-BODY in einer Variablen in Bash erfassen möchten

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

Sie können -soder --silentaustauschbar verwenden.

Venkatt Guhesan
quelle
4

In Bezug auf Frage 1 ( wie cURL weiß, dass die Tabelle nur angezeigt wird, wenn die Ausgabe umgeleitet wird) wusste ich nicht, dass ein Programm erkennen kann, dass die Ausgaben gerichtet sind, aber es scheint, dass es auf POSIX-Systemen eine Funktion gibt, isattydie meldet, ob oder nicht Ein Dateideskriptor bezieht sich auf ein Terminal.

Ian Mackinnon
quelle
2
Hier ist ein Bash-Ausschnitt:[[ -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) Wie kommt es, dass dies nur bei bestimmten Arten von Weiterleitungen auftritt?

von der Curl-Manpage

Wenn Sie eine Fortschrittsanzeige für HTTP-POST- oder PUT-Anforderungen benötigen, müssen Sie die Antwortausgabe mithilfe der Shell-Umleitung (>), -o [Datei] oder ähnlichem in eine Datei umleiten.

curl muss isatty verwenden , um die Umleitung zu bestimmen, und druckt die Fortschrittsanzeige, wenn sie zu einer Datei oder einer Shell-Pipe umgeleitet wird.

2) Wie kann man es am besten unterdrücken?

von der Curl-Manpage

-s, --silent

Lautloser oder leiser Modus. Keine Fortschrittsanzeige oder Fehlermeldungen anzeigen. Macht Curl stumm. Die von Ihnen angeforderten Daten werden weiterhin ausgegeben, möglicherweise sogar an das Terminal / stdout, es sei denn, Sie leiten sie um.

Wyrmwood
quelle
1

Um echte Fehlermeldungen irgendwo abzulegen, sollten Sie strerr in eine Protokolldatei schreiben. Sowas in der Art:

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