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?
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
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.
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.
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:
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
curl -v url 2>&1
, błędy są poprawnie przekierowywane na standardowe wyjście.Odpowiedzi:
dodaj
-s
opcję (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źródło
2>&1
.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.
źródło
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.
źródło
&> /dev/stdout
zdecydowanie brakowało, dziękiJeśli potrzebujesz danych wyjściowych w pliku , możesz użyć przekierowania:
Pamiętaj, aby nie odwrócić
>curl-output.txt
i2>&1
, co nie zadziała ze względu na zachowanie przekierowania basha .źródło
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:
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:Powyższy przykład pobiera prostą
<sometag>
zawartość (nie zawierającą osadzonych tagów) z danych wyjściowych XML instrukcji curl.źródło
Tylko moje 2 centy. Poniższe polecenie powinno załatwić sprawę, zgodnie z wcześniejszą odpowiedzią
Jednak jeśli zajdzie potrzeba przeniesienia wyniku do pliku,
powinno działać.
źródło
Pracowały dla mnie:
Umieść swoją instrukcję curl w skrypcie o nazwie
abc.sh
Teraz biegnij:
Otrzymasz wyniki swojego curl
stdout_output
i informacje o postępie wstderr_output
.źródło
Ten prosty przykład pokazuje, jak przechwytywać dane wyjściowe curl i używać ich w skrypcie bash
test.sh
źródło