
LINUX / KOZLOV2_1
.pdfКоманда zip, в отличие от предыдущих команд, позволяет упаковывать сразу несколько файлов в один архив. К имени сжатого файла автоматически добавляется расширение .zip, если не было специально указано иное. Формат команды: zip имя архива архивируемый(ые) файл(ы). Восстановление zip-файла осуществляется командой unzip: unzip file.zip. В следующем примере покажем, как можно использовать команду zip. Упакуем все файлы в текущей директории в новый файл files.zip:
[antonk@fargo laba2]$ ls channell.plx eee laba2.log rl r2 yyy
[antonk@fargo laba2]$ zip files.zip channell.plx eee laba2.log rl r2 yyy adding: channell.plx (deflated 62%)
adding: eee |
(stored 0%) |
|
||
adding laba2.log (deflated 75%] |
||||
adding: r1 (stored 0%) |
|
|
||
adding: r2 (stored 0%) |
|
|
||
adding: yyy |
(deflated 57%) |
|
||
[antonk@fargo |
laba2]$ ls –l |
|||
total 44 |
|
|
|
|
-rwxr----- |
1 antonk |
user |
1079 Apr 22 13:37 channell.plx |
|
-rw-r--r-- |
1 antonk |
user |
15 Jul 15 16:57 eee |
|
-rw-r--r-- |
1 antonk |
user |
4324 Jul 22 16:33 files.zip |
|
-rw-r----- |
1 antonk |
user |
12352 Apr 12 13:37 laba2.log |
|
-rw-r--r-- |
1 antonk |
user |
6 Jul 15 18:00 r1 |
|
-rw-r--r-- |
1 antonk |
user |
6 Jul 15 18:01 r2 |
|
-rw-r--r-- |
1 antonk |
user |
14 Jul 22 13:53 yyy |
|
[antonk@fargo |
laba2]$ |
|
7.4. Команда jar
Команда jar применяется в тех же случаях, что и tar. Специфика jar в том, что она одновременно и архивирует, и сжимает заданные файлы. Несколько файлов копируются и упаковываются в один архивный файл. Формат команды: jar параметры файл_архива имя_файла(ов) / каталога(ов). Параметры jar приведены в табл.7.2.
111
PDF created with pdfFactory Pro trial version www.pdffactory.com
Таблица 7.2
|
Параметры команды jar |
|
|
|
|
Параметр |
|
Назначение |
|
|
|
c |
|
Создание нового jar-файла |
|
|
|
T |
|
Вывод содержимого jar-файла |
|
|
|
X |
|
Извлечение заданных файлов из jar-архива |
|
|
|
F |
|
Назначение целевого файла |
|
|
|
v |
|
Режим комментариев |
|
|
|
В следующем примере упакуем все файлы в новый jar-архив:
[antonk@fargo laba2]$ jar cvf files.jar * added manifest
adding: channel.plx (in=107 9) (out=4 05) (deflated 38%) adding: eee (in=15) (out=17) (deflated -13%)
adding: files.zip (in=4324) (out=3995) (deflated 92%) adding: laba2.log (in=12352) (out=3144) (deflated 25%)
adding: r1 (in=6) |
(out=8) |
(deflated -33%) |
|||
adding: r2 (in=6) |
(out=8) |
(deflated -33%) |
|||
adding: yyy (in=14) |
(out=6) (deflated 43%) |
||||
[antonk@fargo laba2]$ ls –l |
|
||||
total 56 |
|
|
|
|
|
-rwxr----- |
1 antonk |
user |
1079 Apr 22 |
13:37 channell.plx |
|
-rw-r–r-- |
1 antonk |
user |
15 Jul 15 |
16:57 eee |
|
-rw-r–r-- |
1 antonk |
user |
8892 Jul 22 |
16:37 files.jar |
|
-rif-r–r– |
1 antonk |
|
user |
4324 Jul 22 16:33 files.zip |
|
-rw-r----- |
1 antonk |
user 12352 Apr 22 13:37 laba2.log |
|||
-rw-r–r-- |
1 antonk |
user |
6 Jul 15 18:00 r1 |
||
-rw-r–r-- |
1 antonk |
user |
6 Jul 15 18:01 r2 |
||
-rw-r–r– |
1 antonk |
user |
14 Jul 22 13:53 yyy |
[antonk@fargo laba2]$
112
PDF created with pdfFactory Pro trial version www.pdffactory.com
7.5. Команда cpio
Команда cpio (copy in / out) позволяет архивировать данные в отдельный файл или на ленту, а также извлекать указанные файлы из архива. При этом данные упаковываются на ленту эффективнее, чем с помощью tar. При восстановлении данных с ленты пропускаются все сбойные участки.
В следующем примере с помощью команды find включим в архив cpio_arch.txt лишь те файлы, которые изменились в течение последней недели:
[antonk@fargo laba2 ]$ find . -mtime -7 | cpio -ocv -O cpio_arch.txt
./files.jar |
|
|
|
|
./r1 |
|
|
|
|
./r2 |
|
|
|
|
./yyy |
|
|
|
|
./files.zip |
|
|
|
|
28 blocks |
|
|
|
|
[antonk@fargo |
laba2]$ ls -l |
|
||
total 72 |
|
|
|
|
-rwxr----- |
1 |
antonk |
user |
1079 Apr 22 13:37 channell.plx |
-rw-rw-rw- |
1 antonk |
user |
14336 Jul 22 16:41 cpio_arch.txt |
|
-rw-r--r-- |
1 |
antonk |
user |
8892 Jul 22 16:37 files.jar |
-rw-r--r-- |
1 |
antonk |
user |
4324 Jul 22 16:33 files.zip |
-rw-r----- |
1 |
antonk |
user |
12352 Apr 22 13:37 laba2.log |
-rw-r--r-- |
1 |
antonk |
user |
6 Jul 15 18:01 r2 |
-rw-r--r-- 1 |
antonk |
user |
14 Jul 22 13:53 yyy |
|
[antonk@fargo |
laba2]$ |
|
|
113
PDF created with pdfFactory Pro trial version www.pdffactory.com
Контрольные вопросы
1.Дайте определения понятий «архивирование» и «сжатие». Приведите примеры использования программ архивирования и сжатия.
2.Каково назначение команды tar? На каком носителе по умолчанию размещается tar- архив? Определите основные опции команды tar. Приведите примеры использования данной команды при архивировании директорий, добавлении файлов в архив и разархивировании.
3.Каково назначение команды jar? В чем заключается ее сходство, а в чем различие с командой tar? Приведите примеры.
4.Каково назначение команды cpio? К какому типу команд (сохранения или резервирования данных) она относится? Приведите примеры использования команды cpio.
114
PDF created with pdfFactory Pro trial version www.pdffactory.com
8. Программирование в shell
Выполнение отдельных команд в командном интерпретаторе не всегда является эффективным средством работы с SHELL-оболочкой. Довольно часто требуется
выполнять одни и те же последовательности действий при работе с операционной системой Linux каждый месяц, каждую неделю, каждый день, а иногда и несколько раз в день. Предположим, вы работаете в фирме тестеровщиком программного обеспечения (Test Manager). Каждый день вам требуется в командной оболочке Linux выполнять один и тот же набор действий, а именно: монтирование устройства CD-ROM; копирование всей информации с него в папку, скажем, /opt/program на жестком диске; демонтирование CDROM; чтение файла readme из этой папки; установка программы с жесткого диска из папки /opt/program; создание нового файла отчета в директории /home/user/report_program, удаление всего содержимого дистрибутива с жесткого диска, притом, что основная ваша
работа заключается в тестировании программного обеспечения на предмет выявления недоработок (bugs). Задача на первый взгляд простая, но выполнять подобные действия по несколько раз в день неудобно.
Или, например, вы работаете системным администратором и обслуживаете около 50 компьютеров. Каждый день вам требуется раскопировать на все компьютеры один и тот же файл с инструкциями руководителя на текущий день. Кроме того, в ваши задачи
входит в конце рабочего дня сохранить все данные каждого пользователя на общем сервере фирмы с персональных компьютеров подчиненных. Задача также на первый взгляд простая, но работа по набору команд в командном интерпретаторе для 50 компьютеров занимает много времени. А если к тому же вы при наборе будете ошибаться, например, от усталости? Данные для руководителя очень важны, и потерять их никак нельзя. Но это еще простые действия. А представьте, что названия файлов отчетов, папок с данными, имена компьютеров каждый раз будут меняться? Что делать тогда?
Выход один – написать файл-сценарий, т.е. создать текстовый файл, в котором описать всю последовательность команд с путями, опциями, аргументами, выражениями, действиями и т.д. Использование файла-сценария особенно эффективно, если вам очень часто требуется выполнять последовательность из большого числа команд, а также если
результаты выполнения предыдущих команд влияют на результаты выполнения последующих. С помощью файлов-сценариев можно также работать с арифметическими и логическими выражениями, создавать циклические и управляющие конструкции с использованием специальных операторов, обеспечивающие многократное выполнение группы команд в ОС Linux.
115
PDF created with pdfFactory Pro trial version www.pdffactory.com
8.1. Создание файлов-сценариев
Создание файлов-сценариев – это последовательное объединение набора команд,
операторов командного интерпретатора и некоторых других символов в текстовом файле в заданном порядке, направленное на выполнение конкретного действия. Файлы-
сценарии также называют скриптами, а командные интерпретаторы – латинским названием SHELL. В связи с тем, что на сегодняшний день существуют разные командные интерпретаторы, написание файла-сценария с использованием дополнительных символов, например метасимволов, совместно с командами не должно противоречить правилам синтаксиса командного интерпретатора, в котором предполагается выполнять данный скрипт. Процесс написания таких файлов называют SHELL-программированием. Рассмотрим процесс программирования на примере интерпретатора BASH. Последовательность #!. Написание любого скрипта начинается с последовательности символов #! – указания принадлежности кода скрипта к одному из командных интерпретаторов. В первой строке скрипта обычно пишут последовательность #!, которая указывает системе, какой интерпретатор должен выполнить команды из данного сценария. Если первый символ – пробел, считается, что сценарий написан для BASH или PDKSH. Если сценарий начинается только с символа # , то для его выполнения необходим TC Shell. Если за символом # следует символ !, ядро запустит интерпретатор, путь которого указан далее в этой строке. Например, для BASH будет следующая запись: #!/bin/sh. Пробела или одиночного символа # в начале сценария достаточно для интерпретаторов BASH Shell и TC Shell только при условии, что они будут считывать свой сценарий.
Чтобы один интерпретатор распознал сценарий другого, необходимо включать в сценарий символы #!, после чего указывается путь интерпретирующей программы. Тогда при вызове сценария будет прекращена работа текущего интерпретатора, вместо него будет загружен, а затем выполнен сценарий другого типа. Рекомендуется всегда начинать все сценарии с последовательности #!. Кроме того, строки, начинающиеся с символа #, можно использовать для комментариев действий пользователя в скрипте. Встретив символ #, интерпретатор shell игнорирует эту строку. Каждый комментарий должен завершаться символом окончания строки. Использование комментариев является признаком хорошего тона. При создании скриптов вы можете также применять переменные и сценарии, написанные для других интерпретаторов и команд. Расширение и запуск скриптов. Обычно файлы-сценарии имеют не только имена, но и расширения, хотя расширения необязательны. Чаще всего в качестве расширений
116
PDF created with pdfFactory Pro trial version www.pdffactory.com
используют комбинацию букв sh от латинского слова shell. По такому расширению, не открывая файл, сразу понятно, что это shell-скрипт, так как нам опять же понятно, что файл с расширением .c скорее всего является входным файлом языков высокого уровня С и С++. После набора содержимого файла, файл сохраняется.
Запустить файл можно двумя способами: либо сделать его исполняемым с помощью команды chmod, либо запустить его с помощью специальных операторов командного интерпретатора sh и «точка». Обычно пользователи задают для файла- сценария восьмеричные значения 750 или 550.
В следующем примере сделаем скрипт script.sh выполняемым с помощью команды chmod и запустим его на выполнение из текущей директории в фоновом режиме:
chmod u+x script.sh
./script.sh&
Теперь вернем файлу предыдущие атрибуты и запустим его на выполнение с помощью оператора BASH:
chmod u-x script.sh sh script.sh&
Команда echo. Помимо стандартных команд Linux, самое простое, что можно использовать в скрипте, – это вывод текстовых комментариев пользователю с помощью команды echo. Например, данную команду можно использовать для приглашения пользователя выполнить какое-нибудь действие или для приветствия пользователя. Данная команда также используется, чтобы вернуть значение переменной и отобразить его на экране монитора. В следующем примере с помощью echo отображается приветствие.
echo “Добрый день!»
Добрый день!
Команда read. Вы можете вводить данные с клавиатуры, а не только брать их из файла или из стандартного потока вывода. Команда read служит командой запроса на ввод информации. Обычно она сочетается с подсказкой пользователю, которая приглашает ввести нужную информацию. Когда интерпретатор при чтении данных из скрипта доходит до строки с командой read, он приостанавливается и ждет ввода пользователем данных с клавиатуры. Дальнейшее чтение данных из скрипта происходит только после нажатия пользователем клавиши Enter.
Приведем пример использования read: echo “Введите ваше имя: «
read your_name
117
PDF created with pdfFactory Pro trial version www.pdffactory.com
echo “Добрый день,» your_name “!»
Данный скрипт усложнен по отношению к предыдущему. Здесь используется переменная your_name, значение которой потом применяется совместно с текстом.
8.2. Переменные и аргументы командной строки
Использование переменных. Как и в других высокоуровневых алгоритмических языках программирования, в shell вы можете использовать переменные. Присваивать значения переменным можно через оператор присваивания «равно». Сначала вводится имя переменной, потом без пробела знак «=», затем без пробела значение переменной.
Имя переменной может состоять из любого количества буквенных символов, включая символ подчеркивания. Имя может содержать и цифры, однако не должно начинаться с цифры. Все остальные символы (в частности, восклицательный знак, амперсанд и пробел) в имя входить не должны. Такие символы зарезервированы интерпретатором для специальных целей. Как следствие, имя может состоять только из одного слова, поскольку при синтаксическом анализе команд интерпретатор рассматривает пробел как разделитель имен команд и аргументов.
Значение переменной может состоять из любой последовательности символов. Такая
последовательность может вводиться пользователем с клавиатуры либо генерироваться в результате выполнения какой-нибудь команды Linux. В большинстве случаев при
формировании подобной последовательности применяются кавычки различного вида (одинарные, двойные, обратные кавычки, а также обратная косая черта). Одинарные и двойные кавычки, а также обратная косая черта предоставляют множество способов объединения символов в одну последовательность. Обратные кавычки играют особую роль, которая заключается в выполнении команды Linux и использовании ее результатов в качестве аргументов командной строки.
В качестве значения переменной может применяться последовательность любых символов. Одной из проблем, возникающих при использовании символов, рассматриваемых командным интерпретатором в качестве операторов, является следующая. Командный интерпретатор имеет набор специальных символов, которые используются при выполнении вычислений переменных в командной строке, и если требуется использовать какой-либо из этих символов в качестве части значения переменной, необходимо заключить этот символ в кавычки. При этом следует иметь в виду, что заключение в кавычки специальных символов, выполняемое в командной строке, изменяет функции этих символов следующим образом:
118
PDF created with pdfFactory Pro trial version www.pdffactory.com
∙пробел используется для синтаксического анализа аргументов в командной строке;
∙звездочка *, вопросительный знак и скобки используются при создании списков имен файлов;
∙точка представляет текущий каталог;
∙знак доллара $ используется для вычисления значений переменных, а символы «>» и «<» являются операторами переадресации потока ввода-вывода;
∙символ & (амперсанд) используется для указания, выполнять команду в фоновом
режиме, а вертикальная черта – для указания передавать выходные данные одной команды на стандартный ввод другой (оператор канала).
Двойные и одинарные кавычки позволяют одновременно выделить несколько специальных символов. Специальные символы внутри одинарных или двойных кавычек shell не обрабатывает. Обратная косая черта (\) действует только на тот символ, которому она предшествует. Если вы хотите присвоить переменной строковое значение, состоящее из нескольких слов, последовательность слов необходимо заключить в двойные кавычки. Можно также заключить в двойные кавычки пробелы между словами. Такой прием вы можете рассматривать как создание символьной строки, которая затем будет присвоена переменной. Конечно, все специальные символы, находящиеся внутри двойных кавычек, также должны быть заключены в кавычки.
В следующем примере присвоим переменной «ppp» значение «www123yyy»: ppp=«www123yyy»
После присвоения значения вы можете пользоваться именем переменной для ссылки на это значение, например, использовать его в качестве аргумента команд сценария. На значение переменной можно ссылаться посредством ее имени, которое
предваряется оператором
С помощью уже знакомой команды echo и переменной «ppp» можно отображать значение этой переменной:
echo $ppp www123yyy
Аргументы командной строки. В сценарии, как и в командах Linux, можно использовать аргументы. Аргумент в сценарии обозначается оператором $ с указанием номера позиции в командной строке. Нумерация параметров начинается с цифры «1», а заканчивается цифрой «9». Первый параметр задается переменной $1, второй – $2 и т.д. Аргумент $0 резервируется для имени shell-сценария, в качестве которого выступает первое слово, находящееся в командной строке. По умолчанию имеется возможность устанавливать 9
119
PDF created with pdfFactory Pro trial version www.pdffactory.com
переменных с $1 до $9. Если вводится несколько аргументов, можно отдельно обращаться
ккаждому из них по его номеру.
Вследующем примере в командной строке вводятся три аргумента. Предварительно создадим скрипт arguments с аргументами, а потом его выполним:
[antonk@fargo laba2]$ cat > arguments echo «The first is: $1»
echo «The second is: $2» echo «The third is: $3»
[antonk@fargo laba2]$ sh arguments 1 The first is: 1
The second is: The third is:
[antonk@fargo laba2]$ sh arguments 1 2 3 The first is: 1
The second is: 2 The third is: 3
[antonk@fargo laba2]$
Заметим, что, если вам требуется использовать аргумент(ы) из нескольких слов, вы должны в командной строке взять его (их) в двойные кавычки. Иногда необходимо задать в сценарии точное количество аргументов, это можно выполнить с помощью аргумента $#
. Параметр $* позволяет указать все аргументы в командной строке.
Переменная export. Иногда для разных файлов-сценариев требуется воспользоваться переменной, которая уже была определена. Переменные, которые вы определяете в интерпретаторе shell, являются локальными для него. В некотором смысле такая переменная принадлежит своему интерпретатору. Непосредственно определить переменную для другого интерпретатора нельзя, однако можно экспортировать определение переменной из одного интерпретатора в другой с помощью команды export. Команда export содержит инструкцию для системы, в соответствии с которой для каждого вновь образованного shell будет определяться копия этой переменной. Каждый новый интерпретатор shell будет иметь собственную копию экспортированной переменной.
В следующем примере определим переменную rrr и экспортируем ее для других интерпретаторов с помощью команды export.
[antonk@sentaurus ~]$ rrr=123456 [antonk@sentaurus ~]$ export rrr
120
PDF created with pdfFactory Pro trial version www.pdffactory.com