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?
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
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.
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.
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:
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
curl -v url 2>&1
diesem Fall werden die Fehler für mich korrekt zur Standardausgabe umgeleitet.Antworten:
Fügen Sie die
-s
Option (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 erhaltenquelle
2>&1
.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.
quelle
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.
quelle
&> /dev/stdout
war definitiv der fehlende Teil, dankeWenn Sie die Ausgabe in einer Datei benötigen , können Sie eine Umleitung verwenden:
Bitte stellen Sie sicher, dass Sie das
>curl-output.txt
und nicht umdrehen2>&1
, was aufgrund des Umleitungsverhaltens von bash nicht funktioniert .quelle
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:
Wie in den Kommentaren erwähnt, funktioniert es jedoch auch ohne den xargs-Teil.
-s
Daher ist (stiller Modus) der Schlüssel, um zu verhindern, dass ein externer Fortschritt an STDOUT ausgegeben wird:Im obigen Beispiel wird der einfache
<sometag>
Inhalt (der keine eingebetteten Tags enthält) aus der XML-Ausgabe der Curl-Anweisung abgerufen.quelle
Nur meine 2 Cent. Der folgende Befehl sollte den Trick ausführen, wie zuvor beantwortet
Wenn Sie jedoch die Ausgabe in eine Datei abrufen müssen,
sollte arbeiten.
quelle
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:
Sie erhalten die Ergebnisse Ihrer Locke in
stdout_output
und die Fortschrittsinformationen instderr_output
.quelle
Dieses einfache Beispiel zeigt, wie die Curl-Ausgabe erfasst und in einem Bash-Skript verwendet wird
test.sh
quelle