Jak potokować lub przekierować wyjście curl -v?


117

Z jakiegoś powodu dane wyjściowe zawsze są drukowane na terminalu, niezależnie od tego, czy przekierowuję je przez 2>,> lub |. Czy można to obejść? Dlaczego to się dzieje?


3
Jeśli tak curl -v url 2>&1, błędy są poprawnie przekierowywane na standardowe wyjście.
Josh Lee,

Odpowiedzi:


134

dodaj -sopcję (cichą), aby usunąć wskaźnik postępu, a następnie przekieruj stderr na standardowe wyjście, aby uzyskać szczegółowe dane wyjściowe na tym samym fd, co treść odpowiedzi

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

3
Działa to w przypadku większości witryn internetowych, ale z jakiegoś powodu lokalny serwer na moim komputerze nadal drukuje pełne dane wyjściowe, nawet jeśli wykonam `2> & 1 | grep asdfasdfasdfasdfdfs` lub coś takiego. Pełne dane wyjściowe wraz z nagłówkami są nadal wyświetlane na konsoli. Czy istnieje inny strumień, który mogę przesłać potokiem do programu grep, aby wyodrębnić potrzebne dane?
jonderry,

Jakie informacje faktycznie próbujesz wydobyć, a jakie chcesz wyrzucić. Zrozumiałem, że twoje pytanie oznacza, że ​​chcesz, aby wszystkie dane wyjściowe -v były kierowane na standardowe wyjście.
SingleNegationElimination

Chcę przetworzyć niektóre pliki cookie (w zasadzie grep trochę informacji z plików cookie i zrobić kilka innych rzeczy). Tak, chcę, aby wszystko poszło na standardowe wyjście, więc mogę przetwarzać, co chcę, przez rury. Obecnie część wyników wyświetla się tylko na konsoli i wydaje się, że nie można ich przekierować, i nie jestem pewien dlaczego.
jonderry,

Czy możesz opublikować zrzut ekranu wyjścia pojawiającego się na ekranie, który chcesz przechwycić? Nie wiem, jakiego rodzaju wyniki możesz zobaczyć, które mogłyby zostać przeoczone 2>&1.
SingleNegationElimination

To taki sam typ danych wyjściowych, jak w przypadku każdej innej witryny internetowej. Jedyną różnicą jest to, że serwer działa lokalnie. Czy jest jakiś sposób, aby jakikolwiek program mógł wydrukować na konsoli, ale tekst nie został przechwycony przez stout / sterr?
jonderry,

115

Twój adres URL prawdopodobnie zawiera ampersandy. Miałem też ten problem i zdałem sobie sprawę, że mój adres URL był pełen znaków ampersand (z przekazywanych zmiennych CGI), więc wszystko było wysyłane do tła w dziwny sposób, a tym samym nie przekierowywało poprawnie. Jeśli umieścisz cudzysłowy wokół adresu URL, naprawi to.


1
Miałem ten sam problem. Nie ma potrzeby używania 2> i 1, więc mogę przechowywać oddzielnie dziennik wyjścia i połączenia. Dzięki roadnottaken.
quornian

3
Love Stack-O ... Znalazłem ten q i wzmiankę o znaku & w adresie URL. Mój cytat został umieszczony w cudzysłowie i problem został rozwiązany.
Paulb

2
Cytaty zadziałały dla mnie. Czułem się, jakby curl wykonywał się w innych wątkach. Wielkie dzięki !
vdolez

1
Musiałem szukać w sieci przez pięć minut, zanim uratowałeś mój wieczór :)
Shautieh

Jezu, co za okropny błąd w lokach - przynajmniej powinien zawieść lub dać ostrzeżenie. Twoja odpowiedź z 2012 roku pomogła mi w 2018 roku. Zajęło mi 30 minut, zanim znalazłem Twoją odpowiedź. Dziękuję Ci!
Mauvis Ledford

29

Powyższa odpowiedź nie zadziałała dla mnie, ostatecznie powstała następująca składnia:

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

tee umieszcza dane wyjściowe na ekranie, ale także dołącza je do mojego dziennika.


1
&> /dev/stdoutzdecydowanie brakowało, dzięki
mattspain

10

Jeśli potrzebujesz danych wyjściowych w pliku , możesz użyć przekierowania:

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

Pamiętaj, aby nie odwrócić >curl-output.txti 2>&1, co nie zadziała ze względu na zachowanie przekierowania basha .


3

Znalazłem to samo: sam curl drukowałby do STDOUT, ale nie można go było przesłać potokiem do innego programu.

Na początku myślałem, że rozwiązałem to, używając xargs, aby najpierw powtórzyć wynik:

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

Ale potem, jak wskazano w komentarzach, działa również bez części xargs, więc -s(tryb cichy) jest kluczem do zapobiegania dodatkowym wynikom postępu w STDOUT:

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

Powyższy przykład pobiera prostą <sometag>zawartość (nie zawierającą osadzonych tagów) z danych wyjściowych XML instrukcji curl.


2
w twoich przykładach 'xargs -0 echo |' jest niepotrzebne. Dopóki masz 'curl -s', możesz przesłać wyjście potokiem do innego programu.
Ryan Horrisberger

1

Tylko moje 2 centy. Poniższe polecenie powinno załatwić sprawę, zgodnie z wcześniejszą odpowiedzią

curl -vs google.com 2>&1

Jednak jeśli zajdzie potrzeba przeniesienia wyniku do pliku,

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

powinno działać.


1
Nie dodaje to żadnej wartości do zaakceptowanej odpowiedzi z 2011 roku. Jeśli już, to może być komentarz do tej odpowiedzi.
trincot

0

Pracowały dla mnie:

Umieść swoją instrukcję curl w skrypcie o nazwie abc.sh

Teraz biegnij:

sh abc.sh 1>stdout_output 2>stderr_output

Otrzymasz wyniki swojego curl stdout_outputi informacje o postępie w stderr_output.


0

Ten prosty przykład pokazuje, jak przechwytywać dane wyjściowe curl i używać ich w skrypcie bash

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 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.