Wget im lặng, nhưng nó hiển thị thông báo lỗi


10

Tôi muốn tải xuống một tệp với Wget , nhưng theo triết lý UNIX thông thường, tôi không muốn nó xuất ra bất cứ thứ gì nếu quá trình tải xuống thành công. Tuy nhiên, nếu tải xuống thất bại, tôi muốn một thông báo lỗi.

Các -qtùy chọn ngăn chặn tất cả các đầu ra, bao gồm cả các thông báo lỗi. Nếu tôi bao gồm -nvtùy chọn thay thế, Wget vẫn in (trên stderr):

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

Làm thế nào tôi có thể loại bỏ ngay cả đầu ra đó, nhưng vẫn nhận được thông báo lỗi?

Câu trả lời:


4

Lame hack nếu bạn không thể có câu trả lời tốt hơn:

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

(2> /tmp/err.log chuyển hướng stderr sang tệp tmp; nếu wget trả về 0 [thành công], thì | | ngắn mạch nếu không nó sẽ in ra các giá trị nhật ký lỗi)


+1 Tôi đã bỏ lỡ rằng tất cả đầu ra sẽ vào stderr; Tôi đã xóa câu trả lời của mình về việc chuyển hướng thiết bị xuất chuẩn sang / dev / null.
chepner

5
Điều đó làm việc, nhưng nó khập khiễng . error_log=$(wget -nv example.net 2>&1) || echo $error_loglà một giải pháp thanh lịch hơn, nhưng vẫn vụng về.
phihag

4

Hãy thử curlthay thế:

curl -fsS $url -o $file

Phiên bản dài:

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

Người dùng Gnome có thể thử Gvfs:

gvfs-cp $url $file

1
Thật không may, curl không được cài đặt sẵn trên tất cả các hệ thống debian.
phihag

Tại sao lại thêm --fail? Sẽ không có nghĩa gì nếu coi các lỗi HTTP là thứ gì đó bạn muốn đến stderr?
gilad mayani

Đó chính xác là những gì kết hợp --fail--show-errorlàm.
dùng1686

1

Vì hiện tại tất cả đầu ra của wget đều chuyển sang stderr, có vẻ như để giải quyết 'cách thức thanh lịch' này, bạn sẽ phải vá nguồn wget.

wget thiết kế nguồn ra lệnh chênh lệch mức độ chi tiết giữa các thông báo, thay vì phân chia đơn giản giữa thông báo lỗi và không thông báo lỗi.

Có một lỗi mở về http://savannah.gnu.org/bugs/?33839 này , và cũng có một số cuộc thảo luận cũ hơn. Đây là một bản vá được đề xuất http://www.mail-archive.com/wget%40sunsite.dk/msg03289.html và đây là câu trả lời từ Hrvoje Niksic về điều này http://www.mail-archive.com/wget % 40sunsite.dk / dir03330.html .

Ngoài ra, tất nhiên có giải pháp tốt mà bạn đề xuất trong một nhận xét cho giải pháp kém thanh lịch của Foon.


0

Bạn cũng có thể dẫn đầu ra grepvà lọc thông báo thành công.

Điều này sẽ làm việc:

wget ... -nv 2>&1 | grep -Pv "^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d URL:.*\[\d+\] -> ".*" \[\d+\]$"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.