wake-up-neo.net

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

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

101
jonderry

ergänzen Sie die -s (stille) Option, um die Fortschrittsanzeige zu entfernen, und dann stderr auf stdout umzuleiten, um eine ausführliche Ausgabe auf demselben Feld wie der Antworttext zu erhalten

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

Ihre URL enthält wahrscheinlich ein Et-Zeichen. Ich hatte auch dieses Problem und stellte fest, dass meine URL voller kaufmännischer Und-Zeichen war (da CGI-Variablen übergeben wurden), und daher wurde alles auf seltsame Weise in den Hintergrund gesendet und daher nicht ordnungsgemäß umgeleitet. Wenn Sie die URL in Anführungszeichen setzen, wird dies behoben.

103
roadnottaken

Die obige Antwort hat bei mir nicht funktioniert, was letztendlich die folgende Syntax war:

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

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

24
Amir Mehler

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 achten Sie darauf, dass Sie >curl-output.txt Und 2>&1 Nicht spiegeln, da dies aufgrund des Umleitungsverhaltens von bash nicht funktioniert .

5
panepeter

Ich fand das Gleiche: curl von selbst würde auf STDOUT drucken, konnte aber nicht in ein anderes Programm geleitet werden.

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

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

Aber dann, wie in den Kommentaren erwähnt, funktioniert es auch ohne den xargs-Teil, also -s (stiller Modus) ist der Schlüssel, um die Ausgabe von fremden Fortschritten an STDOUT zu verhindern:

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

Das obige Beispiel fasst das einfache <sometag> Inhalt (ohne eingebettete Tags) aus der XML-Ausgabe der curl-Anweisung.

3
Brent Faust

Folgendes hat für mich funktioniert:

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

Führen Sie nun Folgendes aus:

sh abc.sh 1>stdout_output 2>stderr_output

Sie erhalten die Ergebnisse Ihrer Locke in stdout_output Und die Fortschrittsinformationen in stderr_output.

0
amit

Dieses einfache Beispiel zeigt, wie Sie die Curl-Ausgabe erfassen und in einem Bash-Skript verwenden

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 
0
Brad Parks