Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Чтобы проверить, присутствует ли в системе работающая программа, достаточно вызвать команду ps, как показано в листинге 13.1.
Код
Листинг 13.1.Сценарий startdropbox
#!/bin/bash
# startdropbox — гарантирует выполнение Dropbox в OS X
app="Dropbox.app"
verbose=1
running="$(
ps aux | grep −i $app | grep −v grep)"
if ["$1" = "-s"]; then # −s — немой режим.
··verbose=0
fi
if [! -z "$running"]; then
··if [$verbose −eq 1]; then
····echo "$app is running with PID $(echo $running | cut −d\ −f2)"
··fi
else
··if [$verbose −eq 1]; then
····echo "Launching $app"
··fi
··open −a $app
fi
exit 0
Как это работает
Ключевую роль в этом сценарии играют две строки со значками и
. Первая вызывает команду ps
и затем использует последовательность команд grep, чтобы отыскать требуемое приложение — Dropbox.app — и одновременно исключить из результатов саму команду grep. Если получится непустая строка, значит, Dropbox действует в режиме демона ( демоном называется программа, которая предназначена для работы в фоновом режиме, 24 часа в сутки, 7 дней в неделю, и решает те или иные задачи, не требуя вмешательства пользователя), и на этом все.
Если программа Dropbox.app не запущена, сценарий вызывает команду open в OS X, которая сама отыщет приложение и запустит его.
Запуск сценария
Если сценарий вызывается с флагом −s, он ничего не выводит. Но по умолчанию выводится информация о состоянии программы, как показано в листинге 13.2.
Результаты
Листинг 13.2.Вызов сценария startdropbox для запуска Dropbox.app
$ startdropbox
Launching Dropbox.app
$ startdropbox
Dropbox.app is running with PID 22270
Усовершенствование сценария
В этом сценарии мало что можно усовершенствовать, но, если вы пожелаете перенести его в систему Linux, не забудьте установить официальные пакеты Dropbox с веб-сайта проекта. Запустить Dropbox (после правильной настройки) можно командой startdropbox.
№ 90. Синхронизация с Dropbox
Не составляет труда написать сценарий, синхронизирующий папку или набор файлов с облачной системой, такой как Dropbox. Система сама заботится о синхронизации содержимого локального каталога Dropbox с копией в облаке, обычно эмулируя локальный жесткий диск в системе.
Сценарий в листинге 13.3, syncdropbox, пользуется этим обстоятельством и позволяет легко и просто скопировать каталог с файлами или заданный набор файлов во вселенную Dropbox. В первом случае копируются все файлы в каталоге; во втором — файлы из заданного списка сбрасываются в папку sync в Dropbox.
Код
Листинг 13.3.Сценарий syncdropbox
#!/bin/bash
# syncdropbox — синхронизирует заданный набор файлов или указанную
#·· папку с хранилищем Dropbox. Это достигается путем копирования
#·· папки в ~/Dropbox или набора файлов в папку sync в Dropbox с последующим
#·· запуском Dropbox.app, если это необходимо.
name="syncdropbox"
dropbox="$HOME/Dropbox"
sourcedir=""
targetdir="sync" # Целевая папка в Dropbox для отдельных файлов.
# Проверить начальные аргументы.
if [$# −eq 0]; then
··echo "Usage: $0 [-d source-folder] {file, file, file}" >&2
··exit 1
fi
if ["$1" = "-d"]; then
··sourcedir="$2"
··shift; shift
fi
# Проверка допустимости.
if [! -z "$sourcedir" −a $# −ne 0]; then
··echo "$name: You can't specify both a directory and specific files." >&2
··exit 1
fi
if [! -z "$sourcedir"]; then
··if [! -d "$sourcedir"]; then
····echo "$name: Please specify a source directory with −d." >&2
····exit 1
··fi
fi
#######################
#### ГЛАВНЫЙ БЛОК
#######################
if [! -z "$sourcedir"]; then
··if [-f "$dropbox/$sourcedir" −o — d "$dropbox/$sourcedir"]; then
····echo "$name: Specified source directory $sourcedir already exists." >&2
····exit 1
··fi
··echo "Copying contents of $sourcedir to $dropbox…"
··# −a обеспечивает рекурсивное копирование с сохранением
··#·· информации о владельце и пр.
··cp −a "$sourcedir" $dropbox
else
··# Исходный каталог отсутствует, поэтому переходим к отдельным файлам.
··if [! -d "$dropbox/$targetdir"]; then
····mkdir "$dropbox/$targetdir"
····if [$? -ne 0]; then
······echo "$name: Error encountered during mkdir $dropbox/$targetdir." >&2
······exit 1
····fi
··fi
··# Все готово! Скопировать указанные файлы.
··cp −p — v "$@" "$dropbox/$targetdir"
fi
# Теперь запустить приложение Dropbox, если необходимо, чтобы выполнить
#·· фактическую синхронизацию.
exec startdropbox −s
Как это работает
Большая часть листинга выполняет проверку на наличие ошибок, что очень утомительно, но необходимо, чтобы гарантировать правильную работу сценария и ничего не испортить. (Никто не хочет потерять свои данные!)
Выражения проверки имеют довольно сложный вид, как, например, в строке . Данное выражение проверяет, имеется ли в папке Dropbox файл (что было бы странно) или каталог с именем в переменной $sourcedir. Дословно эта проверка читается так: «если существует-файл $dropbox/$sourcedir ИЛИ существует-каталог $dropbox/$sourcedir, тогда…».
В другой интересной строке вызывается команда cp для копирования отдельных файлов. Желающие могут почитать страницу справочного руководства для команды cp (man cp), чтобы узнать, что значат использованные здесь флаги. На всякий случай напомним, что $@ — это краткая форма представления всех позиционных аргументов командной строки, переданных при вызове сценария.
Запуск сценария
Подобно многим сценариям из этой книги, данный сценарий можно запустить без аргументов, чтобы получить краткую инструкцию о порядке его использования, как показано в листинге 13.4.
Листинг 13.4.Вывод сценария syncdropbox с инструкцией о порядке его использования
$ syncdropbox
Usage: syncdropbox [-d source-folder] {file, file, file}
Результаты
Далее, как показано в листинге 13.5, мы выбрали файл и сохранили его в Dropbox.
Листинг 13.5.Синхронизация выбранного файла с хранилищем Dropbox
$ syncdropbox test.html
test.html — > /Users/taylor/Dropbox/sync/test.html
$
Довольно просто и удобно, если вспомнить, что тем самым вы делаете файлы или каталог с файлами доступными на других устройствах, где настроена ваша учетная запись в Dropbox.
Читать дальшеИнтервал:
Закладка: