Wget молчит, но отображает сообщения об ошибках

11

Я хочу загрузить файл с помощью Wget , но в соответствии с обычной философией UNIX я не хочу, чтобы он что-либо выводил, если загрузка прошла успешно. Однако, если загрузка не удалась, я хочу сообщение об ошибке.

-qОпция подавляет весь вывод, в том числе сообщений об ошибках. Если я включу -nvпараметр вместо этого, Wget все еще печатает (на stderr):

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

Как я могу удалить даже этот вывод, но все равно получать сообщения об ошибках?

phihag
источник

Ответы:

5

Попробуйте curlвместо этого:

curl -fsS $url -o $file

Длинная версия:

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

Пользователи GNOME могут попробовать Gvfs:

gvfs-cp $url $file
user1686
источник
1
К сожалению, curl не установлен на всех системах Debian.
phihag
зачем добавлять --fail? разве не имеет смысла рассматривать ошибки HTTP как то, что вы хотели бы использовать в stderr?
Гилад Майани
Именно это --failи --show-errorделает комбинация .
user1686
4

Хромой взлом, если вы не можете получить лучший ответ:

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

(Файл 2> /tmp/err.log перенаправляет stderr в файл tmp; если wget возвращает 0 [success], в противном случае короткое замыкание || выводит значения журнала ошибок)

Foon
источник
+1 Я пропустил, что весь вывод идет в stderr; Я удалил свой ответ, просто перенаправив стандартный вывод в / dev / null.
chepner
5
Это работает, но это отстой . error_log=$(wget -nv example.net 2>&1) || echo $error_logэто более элегантное решение, но все еще неуклюже.
phihag
1

Поскольку в настоящее время весь вывод wget идет в stderr, кажется, что для решения этого «элегантного способа» вам нужно будет исправить исходный код wget.

Исходный дизайн wget определяет разницу в уровне детализации между сообщениями, а не простое разделение между ошибками, а не сообщениями об ошибках.

Существует открытая ошибка об этом http://savannah.gnu.org/bugs/?33839 , а также некоторые старые обсуждения. Вот предложенный патч http://www.mail-archive.com/wget%40sunsite.dk/msg03289.html и здесь есть ответ от Hrvoje Niksic об этом http://www.mail-archive.com/wget % 40sunsite.dk / msg03330.html .

Помимо этого, есть, конечно, хорошее решение, которое вы предложили в комментарии к менее элегантному решению Фуна.

amotzg
источник
0

Вы также можете перенаправить вывод grepи отфильтровать сообщение об успехе.

Это должно работать:

wget ... -nv 2>&1 | grep -Pv "^\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d URL:.*\[\d+\] -> ".*" \[\d+\]$"
Деннис
источник