Wie leite ich die Ausgabe von curl -v weiter oder leite sie um?


117

Aus irgendeinem Grund wird die Ausgabe immer auf dem Terminal gedruckt, unabhängig davon, ob ich sie über 2> oder> oder | umleitung. Gibt es eine Möglichkeit, dies zu umgehen? Warum passiert dies?


3
In curl -v url 2>&1diesem Fall werden die Fehler für mich korrekt zur Standardausgabe umgeleitet.
Josh Lee

Antworten:


134

Fügen Sie die -sOption (stumm) hinzu, um die Fortschrittsanzeige zu entfernen, und leiten Sie dann stderr zu stdout um, um eine ausführliche Ausgabe auf demselben fd wie der Antworttext zu erhalten

curl -vs google.com 2>&1 | less

3
Dies funktioniert für die meisten Websites, aber aus irgendeinem Grund druckt der lokale Server auf meinem Computer immer noch die vollständige Ausgabe, selbst wenn ich `2> & 1 | mache grep asdfasdfasdfasdfdfs` oder so ähnlich. Die vollständige Ausgabe einschließlich der Header wird weiterhin auf der Konsole angezeigt. Gibt es einen anderen Stream, den ich in grep leiten kann, um einige Daten zu extrahieren, die ich benötige?
Jonderry

Welche Informationen möchten Sie tatsächlich extrahieren und welche Informationen möchten Sie wegwerfen? Ich habe Ihre Frage so verstanden, dass Sie möchten, dass die gesamte Ausgabe von -v an stdout gerichtet wird.
SingleNegationElimination

Ich möchte einige der Cookies verarbeiten (im Grunde genommen einige Informationen aus den Cookies abrufen und andere Dinge tun). Ja, ich möchte, dass alles zum Standard wird, damit ich alles, was ich will, über Rohre verarbeiten kann. Derzeit wird ein Teil der Ausgabe nur auf der Konsole angezeigt und kann möglicherweise nicht umgeleitet werden. Ich bin mir nicht sicher, warum.
Jonderry

Können Sie einen Screenshot der Ausgabe veröffentlichen, die auf dem Bildschirm angezeigt wird, den Sie erfassen möchten? Ich weiß nicht, welche Art von Ausgabe Sie möglicherweise sehen könnten, die möglicherweise übersehen werden könnte 2>&1.
SingleNegationElimination

Es ist genau die gleiche Art der Ausgabe wie bei jeder anderen Website. Der einzige Unterschied besteht darin, dass der Server lokal ausgeführt wird. Gibt es eine Möglichkeit für ein Programm, auf der Konsole zu drucken, ohne dass dieser Text von stout / sterr erfasst wird?
Jonderry

115

Ihre URL enthält wahrscheinlich kaufmännisches Und. Ich hatte auch dieses Problem und stellte fest, dass meine URL voll mit kaufmännischem Und (von übergebenen CGI-Variablen) war und daher alles auf seltsame Weise in den Hintergrund gesendet wurde und daher nicht richtig umgeleitet wurde. Wenn Sie die URL in Anführungszeichen setzen, wird dies behoben.


1
Ich hatte das gleiche Problem. 2> & 1 sind nicht erforderlich, sodass ich das Ausgabe- und das Verbindungsprotokoll getrennt halten kann. Danke, Roadnottaken.
Quornian

3
Love Stack-O ... Ich habe dieses q und die Erwähnung von kaufmännischem Und in der URL gefunden. Es hat meine zitiert und das Problem gelöst.
Paulb

2
Die Zitate haben den Trick für mich getan. Ich hatte das Gefühl, dass Curl in anderen Threads ausgeführt wird. Vielen Dank !
Vdolez

1
Musste fünf Minuten im Internet suchen, bevor du meinen Abend gerettet hast :)
Shautieh

Jesus, was für ein schrecklicher Fehler beim Locken - zumindest sollte er scheitern oder eine Warnung geben. Ihre Antwort von 2012 hat mir 2018 geholfen. Ich habe 30 Minuten gebraucht, um dieses Problem zu lösen, bis ich auf Ihre Antwort gestoßen bin. Danke dir!
Mauvis Ledford

29

Die obige Antwort hat bei mir nicht funktioniert. Was letztendlich geschah, war diese Syntax:

curl https://${URL} &> /dev/stdout | tee -a ${LOG}

tee bringt die Ausgabe auf den Bildschirm, hängt sie aber auch an mein Protokoll an.


1
&> /dev/stdoutwar definitiv der fehlende Teil, danke
Mattspain

10

Wenn Sie die Ausgabe in einer Datei benötigen , können Sie eine Umleitung verwenden:

curl https://vi.stackexchange.com/ -vs >curl-output.txt 2>&1

Bitte stellen Sie sicher, dass Sie das >curl-output.txtund nicht umdrehen 2>&1, was aufgrund des Umleitungsverhaltens von bash nicht funktioniert .


3

Ich fand das Gleiche: Curl selbst würde in STDOUT gedruckt, konnte aber nicht in ein anderes Programm geleitet werden.

Zuerst dachte ich, ich hätte es gelöst, indem ich zuerst xargs verwendet habe, um die Ausgabe wiederzugeben:

curl -s ... <url> | xargs -0 echo | ...

Wie in den Kommentaren erwähnt, funktioniert es jedoch auch ohne den xargs-Teil. -sDaher ist (stiller Modus) der Schlüssel, um zu verhindern, dass ein externer Fortschritt an STDOUT ausgegeben wird:

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

Im obigen Beispiel wird der einfache <sometag>Inhalt (der keine eingebetteten Tags enthält) aus der XML-Ausgabe der Curl-Anweisung abgerufen.


2
in Ihren Beispielen das 'xargs -0 echo |' ist unnötig. Solange Sie 'curl -s' haben, können Sie die Ausgabe an ein anderes Programm weiterleiten.
Ryan Horrisberger

1

Nur meine 2 Cent. Der folgende Befehl sollte den Trick ausführen, wie zuvor beantwortet

curl -vs google.com 2>&1

Wenn Sie jedoch die Ausgabe in eine Datei abrufen müssen,

curl -vs google.com > out.txt 2>&1

sollte arbeiten.


1
Dies fügt der akzeptierten Antwort von 2011 keinen wirklichen Wert hinzu. Wenn überhaupt, könnte dies ein Kommentar zu dieser Antwort sein.
Trincot

0

Folgendes hat bei mir funktioniert:

Fügen Sie Ihre Curl-Anweisung in ein Skript mit dem Namen ein abc.sh

Führen Sie jetzt aus:

sh abc.sh 1>stdout_output 2>stderr_output

Sie erhalten die Ergebnisse Ihrer Locke in stdout_outputund die Fortschrittsinformationen in stderr_output.


0

Dieses einfache Beispiel zeigt, wie die Curl-Ausgabe erfasst und in einem Bash-Skript verwendet wird

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 
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.