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?
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.
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.
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 .
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.
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
.
Dieses einfache Beispiel zeigt, wie Sie die Curl-Ausgabe erfassen und in einem Bash-Skript verwenden
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