Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Название:Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание
- Автор:
- Жанр:
- Издательство:Питер
- Год:2017
- Город:СПб.
- ISBN:978-5-496-03029-8
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Дейв Тейлор - Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание краткое содержание
Цель этой книги — продемонстрировать практические приемы программирования сценариев на bash и познакомить с самыми распространенными утилитами на коротких и компактных примерах, не вдаваясь в излишние подробности. Экспериментируйте с этими сценариями — ломайте, исправляйте и приспосабливайте их под свои нужды, чтобы понять, как они работают. Только так вы сможете решать самые сложные задачи.
Сценарии командной оболочки. Linux, OS X и Unix. 2-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Листинг 9.3.Проверка недействительных ссылок с помощью checklinks на более крупном веб-сайте
$ checklinks http://www.intuitive.com/library/
5 errors encountered. Checked 62 pages at http://intuitive.com/library/:
·· index/·· in BeingEarnest.shtml
·· Archive/f8·· in Archive/ArtofWriting.html
·· Archive/f11··in Archive/ArtofWriting.html
·· Archive/f16··in Archive/ArtofWriting.html
·· Archive/f18··in Archive/ArtofWriting.html
A copy of this output has been saved in intuitive.com.errors
Как показывают результаты, файл BeingEarnest.shtml содержит недействительную ссылку на /index/ , потому что нет такого файла /index/ . Также в файле ArtofWriting.html найдено четыре недействительные ссылки, имеющие странный вид.
Наконец, в листинге 9.4 показаны результаты проверки блога Дейва с обзорами фильмов, которая выявила в нем скрытые ошибки.
Листинг 9.4.Запуск сценария checklinks под управлением утилиты time, чтобы узнать продолжительность его работы
$ time checklinks http://www.daveonfilm.com/
No errors encountered. Checked 982 pages at http://www.daveonfilm.com/
real 50m15.069s
user 0m42.324s
sys 0m6.801s
Обратите внимание: добавив команду time перед другой командой, выполняющейся длительное время, можно узнать, как долго она выполнялась. В данном случае видно, что проверка всех 982 страниц в блоге http://www.daveonfilm.com/потребовала 50 минут реального времени, из которых фактическая обработка заняла 42 секунды. Это очень много!
Усовершенствование сценария
Файл с данными 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 сайта для проверки.
Результаты
Проверим сайт http://intuitive.com/на наличие недействительных ссылок, как показано в листинге 9.6.
Листинг 9.6.Запуск сценария checkexternal для проверки http://intuitive.com/
$ checkexternal −a http://intuitive.com/
http://chemgod.slip.umd.edu/~kidwell/weather.html fails with error code 6
http://epoch.oreilly.com/shop/cart.asp fails with error code 7
http://ezone.org:1080/ez/ fails with error code 7
http://fx.crewtags.com/blog/ fails with error code 6
http://linc.homeunix.org:8080/reviews/wicked.html fails with error code 6
http://links.browser.org/ fails with error code 6
http://nell.boulder.lib.co.us/ fails with error code 6
http://rpms.arvin.dk/slocate/ fails with error code 6
http://rss.intuitive.com/ fails with error code 6
http://techweb.cmp.com/cw/webcommerce fails with error code 6
http://tenbrooks11.lanminds.com/ fails with error code 6
http://www.101publicrelations.com/blog/ fails with error code 6
http://www.badlink/somewhere.html fails with error code 6
http://www.bloghop.com/ fails with error code 6
Интервал:
Закладка: