Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
······ sftp [user@]host[: dir[/]]
······ sftp −b batchfile [user@]host
В целом это правильно, но выглядит непонятно. Напротив, сценарий mysftp позволяет продолжить и установить соединение, как показано в листинге 4.11.
Листинг 4.11.Попытка запустить сценарий mysftp без аргументов выглядит намного понятнее
$ mysftp
User account: taylor
Remote host: intuitive.com
Connecting to intuitive.com…
taylor@intuitive.com's password:
sftp> quit
Вызовите сценарий, указав имя удаленного хоста, как при использовании обычной программы ftp, и он предложит ввести только учетные данные (как показано в листинге 4.12), а затем скрытно вызовет sftp.
Листинг 4.12.Запуск сценария mysftp с единственным аргументом: именем хоста для подключения
$ mysftp intuitive.com
User account: taylor
Connecting to intuitive.com…
taylor@intuitive.com's password:
sftp> quit
Усовершенствование сценария
Когда есть такой сценарий, неизбежно возникает вопрос, можно ли создать на его основе инструмент автоматизированного резервного копирования или синхронизации. И действительно, mysftp — отличный кандидат на эту роль. В рамках такого усовершенствования можно было бы определить каталог в вашей системе, затем написать сценарий-обертку, создающий ZIP-архив важных файлов в этом каталоге, и использовать mysftp для копирования архива на сервер или в облачное хранилище. Все перечисленное мы и попробуем реализовать в сценарии № 72, в главе 9.
№ 32. Исправление grep
Некоторые версии grep предлагают широкий диапазон возможностей, включая особенно полезный вывод контекста (одна-две строки выше и ниже), окружающего найденную в файле строку. Кроме того, некоторые версии grep подсвечивают фрагмент строки, совпавший с указанным шаблоном (по крайней мере для простых шаблонов). Возможно, у вас уже есть такая версия grep. Но возможно, и нет.
К счастью, если реализовать эти функции в сценарии командной оболочки, они будут доступны даже в старых коммерческих системах Unix с относительно примитивной командой grep. Чтобы определить количество строк контекста выше и ниже совпадения, передайте сценарию флаг −c value и шаблон для поиска. Этот сценарий (представлен в листинге 4.13) также заимствует ANSI-последовательности управления цветом из сценария № 11 в главе 1 для подсветки совпавшего фрагмента.
Код
Листинг 4.13.Сценарий cgrep
··#!/bin/bash
··# cgrep −grep с поддержкой вывода контекста и подсветкой совпадения
··context=0
··esc="^["
··boldon="${esc}[1m" boldoff="${esc}[22m"
··sedscript="/tmp/cgrep.sed.$$"
··tempout="/tmp/cgrep.$$"
··function showMatches
··{
····matches=0
····echo "s/$pattern/${boldon}$pattern${boldoff}/g" > $sedscript
····for lineno in $(grep −n "$pattern" $1 | cut −d: −f1)
····do
······if [$context −gt 0]; then
········prev="$(($lineno — $context))"
········if [$prev −lt 1]; then
··········# Чтобы исключить ошибку "invalid usage of line address 0."
··········prev="1"
········fi
········next="$(($lineno + $context))"
········if [$matches −gt 0]; then
··········echo "${prev}i\\" >> $sedscript
··········echo "-" >> $sedscript
········fi
········echo "${prev},${next}p" >> $sedscript
······else
········echo "${lineno}p" >> $sedscript
······fi
······matches="$(($matches + 1))"
····done
····if [$matches −gt 0]; then
······sed −n — f $sedscript $1 | uniq | more
····fi
··}
··trap "$(which rm) −f $tempout $sedscript" EXIT
··if [-z "$1"]; then
····echo "Usage: $0 [-c X] pattern {filename}" >&2
····exit 0
··fi
··if ["$1" = "-c"]; then
····context="$2"
····shift; shift
··elif ["$(echo $1|cut −c1-2)" = "-c"]; then
····context="$(echo $1 | cut −c3-)"
····shift
··fi
··pattern="$1"; shift
··if [$# −gt 0]; then
····for filename; do
······echo "- $filename —"
······showMatches $filename
····done
··else
····cat — > $tempout # Записать поток во временный файл.
····showMatches $tempout
··fi
··exit 0
Как это работает
Этот сценарий задействует команду grep −n, чтобы получить номера всех совпавших строк в файле , и затем, используя заданное число строк контекста, определяет номера начальной
и конечной
строк для включения в контекст. Эти номера выводятся во временный сценарий для sed, объявленный в
, который выполняет команду поиска с заменой, чтобы добавить к найденному совпадению ANSI-последовательности включения и выключения вывода жирным шрифтом. Перечисленные операции составляют почти 90 % сценария.
Также следует отметить использование команды trap , которая позволяет включать обработку событий в цикл выполнения сценария командной оболочкой. В первом аргументе ей передается последовательность команд, которую следует выполнить, а в остальных — имена сигналов (событий). В данном случае мы сообщаем оболочке, что в момент выхода из сценария она должна вызвать команду rm, чтобы удалить два временных файла.
Самое примечательное в команде trap — она сработает в любом случае, независимо от того, в какой точке сценария произойдет выход. В последующих сценариях вы увидите, что с помощью trap можно обработать самые разные сигналы, а не только SIGEXIT (или EXIT, или числовой эквивалент сигнала SIGEXIT, который равен 0). Фактически несколькими вызовами команды trap можно определить последовательности команд для обработки нескольких разных сигналов, то есть реализовать вывод сообщения «временные файлы стерты», если кто-то пошлет сценарию сигнал SIGQUIT ( ctrl-C), которое не будет выводиться в случае обычного события выхода (SIGEXIT).
Запуск сценария
Сценарий может работать со стандартным вводом, сохраняя входные данные во временный файл и затем обрабатывая его, как если бы имя этого файла было получено из аргумента командной строки, или со списком файлов, указанных в командной строке. В листинге 4.14 показан пример передачи единственного файла через аргумент командной строки.
Результаты
Листинг 4.14.Тестирование сценария cgrep
$ cgrep −c 1 teacup ragged.txt
Интервал:
Закладка: