Próbuję wydrukować tylko pełne sekcje żądania cURL (do których są wysyłane stderr
) z powłoki bash.
Ale kiedy przekierowuję w stdout
ten sposób:
curl -v http://somehost/somepage > /dev/null
Jakaś tabela wyników pojawia się w środku wyniku, aby stderr
:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
Następnie pod koniec:
{ [data not shown]
118 592 0 592 0 0 15714 0 --:--:-- --:--:-- --:--:-- 25739
Co sprawia, że nagłówki odpowiedzi są mniej czytelne.
Nie widzę tego tekstu, gdy nie przekierowuję.
Kolejny sposób, aby zobaczyć efekty:
Tabela nie pojawia się:
curl -v http://somehost/somepage 2>&1
Pojawia się tabela:
curl -v http://somehost/somepage 2>&1 | cat
1) Dlaczego pojawia się to tylko w przypadku niektórych rodzajów przekierowań?
2) Jaki jest najładniejszy sposób na stłumienie tego?
Dziękuję Ci
-s
był kluczem!-s
ale bez-v
ciebie nie zobaczysz błędów takich jak brak połączenia. W tym celu należy również dodać-S
(lub--show-error
) jak w odpowiedzi mhoydisa.curl
dojq
. Brak paska postępu bez przesyłania dojq
, a następnie podczas przesyłania dojq
muszę wrócić i dodać-s
.STDOUT
nie jest tty. Gdy dane wyjściowe nie są przesyłane potokowo, nie chcesz, aby informacje o postępie były przeplatane z normalnymi danymi wyjściowymi, które możesz zobaczyć i mieć pewne pojęcie o postępie. Gdy dane wyjściowe są przekierowywane lub przesyłane strumieniowo, nie można ich zobaczyć, więc nie ma wskaźnika postępu - chyba że pasek postępu jest włączony.Spowoduje to pominięcie okna dialogowego statusu, ale w przeciwnym razie spowoduje wyświetlenie błędów w STDERR.
Powyższe wyświetla tabelę statusu podczas przekierowywania.
Powyższe pomija tabelę statusu podczas przekierowywania, ale błędy nadal będą przechodzić do STDERR.
Powyżej jest przykładem błędu STDERR.
Wystarczy dodać 2> i 1 na końcu, aby przekierować STDERR do STDOUT (w tym przypadku do pliku).
źródło
Według
man curl
:Przykładowe użycie:
lub jeśli chcesz przechwycić BODY HTTP do zmiennej w bash
Możesz używać
-s
lub--silent
zamiennie.źródło
W odniesieniu do pytania 1 ( skąd cURL wie, że wyświetla tabelę tylko wtedy, gdy wyjście jest przekierowywane), nie zdawałem sobie sprawy, że program może powiedzieć, że jego wyjścia są kierowane, ale wydaje się, że w systemach POSIX jest funkcja,
isatty
która informuje, czy deskryptor pliku odnosi się do terminala.źródło
[[ -p /dev/stdout ]] && echo "stdout is to a pipe"; [[ -t 1 ]] && echo "output to terminal"; [[ ! -t 1 && ! -p /dev/stdout ]] && echo "output redirected"
ze strony man curl
curl musi używać isatty do określenia przekierowania i drukuje wskaźnik postępu po przekierowaniu do pliku lub potoku powłoki.
ze strony man curl
źródło
Aby gdzieś umieścić prawdziwe komunikaty o błędach, należy zapisać strerr w pliku dziennika. Coś w tym stylu:
źródło
Będąc za proxy używam takiego polecenia.
date -s "$ (curl --proxy http: // PROXY: 8080 -s http://google.com --head -s | grep Date | sed 's / Date: // g')"
źródło