Wget milczy, ale wyświetla komunikaty o błędach


11

Chcę pobrać plik za pomocą Wget , ale zgodnie ze zwykłą filozofią UNIX, nie chcę, aby coś wypisało, jeśli pobieranie się powiedzie. Jednak jeśli pobieranie się nie powiedzie, chcę komunikat o błędzie.

-qOpcja wyłącza wszystkie wyjścia, w tym komunikaty o błędach. Jeśli -nvzamiast tego podam opcję, Wget nadal drukuje (na stderr):

2012-05-03 16:17:05 URL:http://example.net/ [2966] -> "index.html" [1]

Jak mogę usunąć nawet to wyjście, ale nadal otrzymuję komunikaty o błędach?

Odpowiedzi:


5

Spróbuj curlzamiast tego:

curl -fsS $url -o $file

Długa wersja:

curl --fail --silent --show-error $url --output $file

Użytkownicy GNOME mogą wypróbować Gvfs:

gvfs-cp $url $file

1
Niestety, curl nie jest preinstalowany we wszystkich systemach Debiana.
phihag

po co dodawać --fail? czy nie ma sensu traktować błędów HTTP jako czegoś, co chciałbyś przejść do stderr?
gilad mayani

Właśnie to robi kombinacja --faili --show-error.
user1686,

4

Kulawy hack, jeśli nie możesz uzyskać lepszej odpowiedzi:

wget {url} 2>/tmp/err.log || cat /tmp/err.log; rm /tmp/err.log

(2> /tmp/err.log przekierowuje stderr do pliku tmp; jeśli wget zwróci 0 [sukces], zwarcie || w przeciwnym razie wydrukuje wartości dziennika błędów)


+1 Tęskniłem za tym, że cała produkcja szła w parze; Usunąłem odpowiedź dotyczącą przekierowania standardowego wyjścia na / dev / null.
chepner

5
To działa, ale jest kiepskie . error_log=$(wget -nv example.net 2>&1) || echo $error_logjest bardziej eleganckim rozwiązaniem, ale wciąż niezdarnym.
phihag

1

Ponieważ obecnie wszystkie dane wyjściowe wget są przesyłane do stderr, wydaje się, że aby rozwiązać ten „elegancki sposób”, musiałbyś załatać źródło wget.

Projekt źródła wget dyktuje różnicę poziomu szczegółowości między komunikatami, zamiast prostego podziału na komunikat o błędzie, a nie o błędzie.

Istnieje otwarty błąd dotyczący tej http://savannah.gnu.org/bugs/?33839 , a także trochę starszej dyskusji. Oto sugerowana łatka http://www.mail-archive.com/wget%40sunsite.dk/msg03289.html i tutaj jest odpowiedź Hrvoje Niksica na temat tego http://www.mail-archive.com/wget % 40sunsite.dk / msg03330.html .

Poza tym istnieje oczywiście dobre rozwiązanie, które zaproponowałeś w komentarzu do mniej eleganckiego rozwiązania Foon.


0

Możesz także przesłać dane wyjściowe do grepi odfiltrować komunikat o powodzeniu.

To powinno działać:

wget ... -nv 2>&1 | grep -Pv "^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d URL:.*\[\d+\] -> ".*" \[\d+\]$"
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.