Wget с выводом на уровне ошибок - PullRequest
7 голосов
/ 07 ноября 2010

Я хочу создать файл bash (.sh), который выполняет следующие действия:

Я называю сценарий как ./download.sh www.blabla.com/bla.jpg

скрипт должен выводить эхо, если файл загружен или нет ...

Как я могу это сделать? Я знаю, что могу использовать errorlevel, но я новичок в Linux, так что ...

Заранее спасибо!

Ответы [ 3 ]

6 голосов
/ 07 ноября 2010

Обычно приложения в Linux устанавливают значение переменной окружения $? на провал. Вы можете проверить этот код возврата и посмотреть, не выдаст ли он вам ошибку для wget.

#!/bin/bash
wget $1 2>/dev/null
export RC=$?
if [ "$RC" = "0" ]; then
   echo $1 OK
else
    echo $1 FAILED
fi

Вы можете назвать этот скрипт download.sh. Измените разрешения на 755 с помощью chmod 755. Назовите его с именем файла, который вы хотите загрузить. ./download.sh www.google.com

3 голосов
/ 07 ноября 2010

Вы можете попробовать что-то вроде:

#!/bin/sh

[ -n $1 ] || {
    echo "Usage: $0 [url to file to get]" >&2
    exit 1
}

wget $1

[ $? ] && {
  echo "Could not download $1" | mail -s "Uh Oh" you@yourdomain.com
  echo "Aww snap ..." >&2
  exit 1
}

# If we're here, it downloaded successfully, and will exit with a normal status

При создании сценария, который (вероятно) будет вызываться другими сценариями, важно сделать следующее:

  • Убедитесь, что аргумент здравомыслие
  • Отправка электронной почты, запись в журнал или что-то еще, чтобы кто-то знал, что пошло не так

>&2 просто перенаправляет вывод сообщений об ошибках наstderror, который позволяет вызывающему скрипту делать что-то вроде этого:

foo-downloader >/dev/null 2>/some/log/file.txt

Поскольку это короткая оболочка, нет причин оставлять немного здравомыслия:)

Это также позволяетвы можете выборочно направить вывод wget в /dev/null, вы можете захотеть увидеть его при тестировании, особенно если вы получите электронное письмо с сообщением об ошибке:)

0 голосов
/ 21 января 2015

wget выполняется неинтерактивным способом. Это означает, что wget работает в фоновом режиме, и вы не можете поймать код возврата с $?.

Одним из решений является обработка свойства "--server-response" при поиске кода состояния http 200. Пример:

wget --server-response -q -o wgetOut http://www.someurl.com
sleep 5
_wgetHttpCode=`cat wgetOut | gawk '/HTTP/{ print $2 }'`
if [ "$_wgetHttpCode" != "200" ]; then
    echo "[Error] `cat wgetOut`"
fi

Примечание: wget нужно некоторое время, чтобы закончить свою работу, по этой причине я поставил "сон 5". Это не лучший способ, но он работал нормально для тестирования решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...