Дейв Тейлор - Сценарии командной оболочки. 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-е издание - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
№ 34. Гарантия максимальной степени сжатия файла
Как было отмечено в рецепте № 33, большинство реализаций Linux включает несколько утилит сжатия, но решать, какая из них наиболее эффективно сожмет конкретный файл, приходится пользователю. Однако пользователи обычно привыкают к одной программе, не подозревая, что другие утилиты дали бы лучшие результаты. Еще бо́льшую сумятицу вносит тот факт, что некоторые файлы лучше сжимаются с использованием одного алгоритма, а другие — с использованием другого, и нет никакой возможности выявить лучший вариант без прямых экспериментов.
Логичное решение проблемы — написать сценарий, который сожмет файл с применением каждого из инструментов и оставит наименьший файл как наилучший. Именно это делает сценарий bestcompress, представленный в листинге 4.19!
Код
Листинг 4.19.Сценарий bestcompress
#!/bin/bash
# bestcompress — пытается сжать файл всеми доступными инструментами
#·· сжатия и сохраняет наименьший сжатый файл, сообщая результат
#·· пользователю. Если флаг −a не указан, bestcompress пропускает
#·· сжатые файлы, указанные в аргументах командной строки.
Z="compress"···· gz="gzip"····bz="bzip2"
Zout="/tmp/bestcompress.$$.Z"
gzout="/tmp/bestcompress.$$.gz"
bzout="/tmp/bestcompress.$$.bz"
skipcompressed=1
if ["$1" = "-a"]; then
··skipcompressed=0; shift
fi
if [$# −eq 0]; then
··echo "Usage: $0 [-a] file or files to optimally compress" >&2
··exit 1
fi
trap "/bin/rm −f $Zout $gzout $bzout" EXIT
for name in "$@"
do
··if [! -f "$name"]; then
····echo "$0: file $name not found. Skipped." >&2
····continue
··fi
··if ["$(echo $name | egrep '(\.Z$|\.gz$|\.bz2$)')"!= ""]; then
····if [$skipcompressed −eq 1]; then
······echo "Skipped file ${name}: It's already compressed."
······continue
····else
······echo "Warning: Trying to double-compress $name"
····fi
··fi
··# Запустить параллельное сжатие файла тремя инструментами.
··$Z < "$name" > $Zout &
··$gz < "$name" > $gzout &
··$bz < "$name" > $bzout &
··wait # ждать, пока все три инструмента завершат сжатие.
··# Выявить файл, сжатый лучше всех.
··smallest="$(ls −l "$name" $Zout $gzout $bzout | \
····awk '{print $5"="NR}' | sort −n | cut −d= −f2 | head -1)"
··case "$smallest" in
····1) echo "No space savings by compressing $name. Left as is."
········;;
····2) echo Best compression is with compress. File renamed ${name}.Z
········mv $Zout "${name}.Z"; rm −f "$name"
········;;
····3) echo Best compression is with gzip. File renamed ${name}.gz
········mv $gzout "${name}.gz"; rm −f "$name"
········;;
····4) echo Best compression is with bzip2. File renamed ${name}.bz2
········mv $bzout "${name}.bz2"; rm −f "$name"
··esac
done
exit 0
Как это работает
Самая интересная строка в сценарии — . Команда ls в этой строке выводит размеры каждого файла (исходного и трех сжатых, в определенном порядке), команда awk выделяет размеры файлов, команда sort сортирует результаты в числовом порядке, и в конце остается номер строки в выводе ls с наименьшим файлом. Если все сжатые версии получились больше оригинала, результат будет равен 1, и на экране появится соответствующее сообщение
. Иначе число покажет, какая из утилит — compress, gzip или bzip2 — лучше справилась с задачей. Затем остается только переместить соответствующий файл в текущий каталог и удалить оригинал.
Обратите также внимание на строку , где производится запуск всех трех утилит сжатия. Утилиты запускаются параллельно, благодаря использованию завершающего символа &, который перемещает запущенную программу в подоболочку. Последующая команда wait приостанавливает сценарий, пока все запущенные программы не завершатся. В однопроцессорной системе этот прием может не дать существенного прироста производительности, но в многопроцессорной задача будет распределена между несколькими процессами, и ее выполнение теоретически должно завершиться быстрее.
Запуск сценария
Этому сценарию следует передать список имен файлов для сжатия. Если какой-то из них окажется сжатым и вы хотите попробовать сжать его еще сильнее, используйте флаг −a; иначе сжатые файлы будут пропущены.
Результаты
Лучше всего продемонстрировать работу сценария на примере сжатия файла, который показан в листинге 4.20.
Листинг 4.20.Вывод команды ls показывает, что в каталоге присутствует файл со сказкой «Алиса в Стране Чудес». Обратите внимание, что файл имеет размер 154872 байт
$ ls −l alice.txt
-rw-r-r- 1 taylor staff 154872 Dec 4 2002 alice.txt
Сценарий скрывает, что сжатие выполняется тремя утилитами, и просто выводит окончательный результат, как показано в листинге 4.21.
Листинг 4.21.Запуск сценария bestcompress для сжатия файла alice.txt
$ bestcompress alice.txt
Best compression is with compress. File renamed alice.txt.Z
Как показано в листинге 4.22, сжатый файл получился намного меньше оригинала.
Листинг 4.22.Размер сжатого файла (66287 байт) значительно уменьшился с размером оригинала, как было показано в листинге 4.20
$ ls −l alice.txt.Z
-rw-r-r- 1 taylor wheel 66287 Jul 7 17:31 alice.txt.Z
Глава 5. Системное администрирование: управление пользователями
Никакая сложная операционная система, будь то Windows, OS X или Unix, не может функционировать бесконечно долго без вмешательства человека. Если вы работаете в многопользовательской системе Linux, значит, кто-то выполняет задачи системного администрирования. Вы можете игнорировать пресловутого «человека за ширмой», управляющего всем и вся, или сами быть великим и могучим волшебником из страны Оз — тем, кто двигает рычаги и нажимает кнопки, чтобы обеспечить нормальную работу системы. Если вы единственный пользователь системы, вам придется регулярно решать задачи системного администрирования самостоятельно.
К счастью, сценарии командной оболочки не в последнюю очередь существуют для того, чтобы упростить жизнь администраторам систем Linux (о чем и пойдет речь в этой главе). Довольно многие команды Linux в действительности являются сценариями, и многие из самых основных задач, такие как добавление пользователей, анализ использования дискового пространства и управление файлами гостевой учетной записи, можно достаточно эффективно решать с помощью коротких сценариев.
Что интересно, многие сценарии, предназначенные для системного администрирования, включают не более 20–30 строк. С помощью команд Linux можно выявить, какие команды являются сценариями, а добавив конвейер — узнать, сколько строк содержит каждый из них. Ниже перечисляется 15 самых коротких сценариев в /usr/bin/ :
Читать дальшеИнтервал:
Закладка: