Усовершенствование сценария
Файл с данными traverse.dat содержит список всех встреченных URL, а файл reject.dat — список всех встреченных, но непроверенных URL, обычно потому, что они являются внешними ссылками. Их проверкой мы займемся в следующем сценарии. Фактически найденные ошибки фиксируются в файле traverse.errors , как можно догадаться по строке
в листинге 9.1.
Чтобы заставить этот сценарий сообщать о недействительных ссылках на изображения, добавьте команду grep для поиска в файле traverse.errors расширений имен файлов .gif, jpeg или .png перед передачей результатов команде sed (которая здесь просто убирает из вывода все лишнее, чтобы сделать его более удобочитаемым).
№ 70. Выявление недействительных внешних ссылок
Этот сценарий (листинг 9.5) является сопутствующим для сценария № 69 и основывается на результатах, произведенных им, выявляя все внешние ссылки на сайте или в его подкаталогах, обращение к которым приводит к ошибке «404 Not Found». Для простоты предполагается, что непосредственно перед данным сценарием выполнялся предыдущий сценарий и в текущем каталоге хранится файл *.rejects со списком URL.
Листинг 9.5.Сценарий checkexternal
#!/bin/bash
# checkexternal — проверяет все ссылки на веб-сайте и конструирует список
#·· внешних ссылок, затем проверяет каждую, чтобы выявить среди них
#·· недействительные. Флаг −a заставляет сценарий вывести все ссылки,
#·· независимо от их доступности или недоступности; по умолчанию выводятся
#·· только недоступные ссылки.
listall=0; errors=0; checked=0
if ["$1" = "-a"]; then
··listall=1; shift
fi
if [-z "$1"]; then
··echo "Usage: $(basename $0) [-a] URL" >&2
··exit 1
fi
trap "$(which rm) −f traverse*.errors reject*.dat traverse*.dat" 0
outfile="$(echo "$1" | cut −d/ −f3). errors.ext"
URLlist="$(echo $1 | cut −d/ −f3 | sed 's/www\.//'). rejects"
rm −f $outfile # Подготовиться к выводу новой информации.
if [! -e "$URLlist"]; then
··echo "File $URLlist not found. Please run checklinks first." >&2
··exit 1
fi
if [! -s "$URLlist"]; then
··echo "There don't appear to be any external links ($URLlist is empty)." >&2
··exit 1
fi
#### Теперь все готово к анализу…
for URL in $(cat $URLlist | sort | uniq)
do
··curl −s "$URL" > /dev/null 2>&1; return=$?
··if [$return −eq 0]; then
····if [$listall −eq 1]; then
······echo "$URL is fine."
····fi
··else
····echo "$URL fails with error code $return"
····errors=$(($errors + 1))
··fi
··checked=$(($checked + 1))
done
echo ""
echo "Done. Checked $checked URLs and found $errors errors."
exit 0
Это не самый элегантный сценарий в книге. Он реализует метод простого перебора для проверки внешних ссылок. В блоке кода в
для каждой найденной внешней ссылки вызывается команда curl, которая проверяет ее доступность, пытаясь получить содержимое по адресу URL ссылки и сразу отбрасывая его по получении.
Конструкция 2>&1 заслуживает отдельного упоминания: она перенаправляет выходное устройство с дескриптором 2 в выходное устройство с дескриптором 1. В командной строке выходное устройство с дескриптором 2 соответствует stderr (стандартному потоку вывода сообщений об ошибках), а выходное устройство с дескриптором 1 соответствует stdout (стандартному потоку вывода). Все, что выводится в stderr, конструкция 2>&1 перенаправляет в stdout. Но обратите внимание, что сначала поток stdout перенаправляется в /dev/null. Это виртуальное устройство, куда можно записать бесконечный объем данных, — своеобразная черная дыра в системе. То есть указанная конструкция гарантирует, что stderr так же будет перенаправлен в /dev/null. Мы выбрасываем информацию, потому что нас интересует только нулевой или ненулевой код, возвращаемый командой. Ноль сообщает об успехе; ненулевое значение — об ошибке.
Количество проверенных внутренних страниц определяется количеством строк в файле traverse.dat , а число внешних ссылок можно найти в файле reject.dat . Если указан флаг −a, сценарий выводит все внешние ссылки, независимо от их доступности или недоступности. В противном случае отображаются адреса URL только из недоступных ссылок.
Чтобы запустить сценарий, просто передайте ему в аргументе URL сайта для проверки.
Читать дальше