Методы / Куликова Н.В., Петровская Е.Н. (ч.1,2)
.pdfАрхиватор tar
Первоначально tar был разработан для резервного копирования на ленту, отсюда и его название – Tape ARchiver. Но, поскольку возможность помещать большое количество файлов внутрь одного чрезвычайно удобно (к примеру, для хранения и передачи групп файлов, например, дистрибутивов), то он получил более широкое распространение.
Вообще-то в каждом Unix есть свой подвид tar, со слегка отличающимися опциями. Но основные опции (создать, развернуть, проверить архив) одинаковы во всех версиях. В Linux используется GNU-версия tar, которая доступна в большинстве других Unix (иногда под именем «gtar»).
Если tar используется для работы с файлами-архивами (а не с лентой), то его вызов обычно выглядит так:
tar <буква-команды>f <имяархива.tar> [файлы...]
В качестве команды обычно используется одна из следующих букв:
c – (Create) создать архив;
x – (eXtract) распаковать архив;
t – (Test) просмотреть содержимое архива.
Например, чтобы создать архив /tmp/someconfs.tar, содержа-
щий файлы /etc/fstab и /etc/passwd: |
/tmp/someconfs.tar |
||
bobby:~% |
tar |
cf |
|
/etc/fstab /etc/passwd |
|
tar: Removing leading `/' from absolute path names in the archive
bobby:~% _
Здесь сразу надо заметить две особенности:
•во-первых, у файлов, имена которых указаны в абсолютном виде, т.е. начинаются со «/», tar автоматически этот «/» обрезает, чтобы позже можно было распаковать архив в любое место (а не только обратно в /etc/);
•во-вторых, при нормальной работе tar ничего не печатает на экране (в отличие от pkzip и arj); чтобы он показывал обрабатываемые файлы, надо указать ключ «v»:
141
bobby:~% tar cvf /tmp/someconfs.tar /etc/fstab /etc/passwd
tar: Removing leading `/' from absolute path names in the archive
etc/fstab
etc/passwd bobby:~% _
Если указать «vv», то кроме имен будут показываться те же атрибуты, что и при «ls -l».
Вообще у tar довольно нестандартный синтаксис команд: хотя все ключи и можно указывать обычным способом (т.е. через «-»), и даже длинные ключи (с «-»), но обычно первым параметром ему указывается сочетание из нескольких букв, первая из которых является командой, а остальные – ключами. Так, «f» – это тоже ключ, который говорит, что далее указано имя файлаархива (поэтому «f» надо указывать в конце списка).
Хотя в большинстве систем tar прекрасно понимает именно такой синтаксис, в неко-
Замечание торых старых Unix'ах перед «сочетанием букв» обязательно надо указывать «-».
Для просмотра архива используется команда «t» (ключ «v» указывает, что надо выдавать более полную информацию):
bobby:~% tar tvf /tmp/someconfs.tar
-rw-r--r-- root/root |
756 |
1998-12-21 |
|
16:40 |
etc/fstab |
1309 |
1999-02-22 |
-rw-r--r-- root/root |
|||
10:35 |
etc/passwd |
|
|
bobby:~% _ |
|
|
Для распаковки применяется команда «x»: bobby:~% mkdir /tmp/test bobby:~% cd /tmp/test bobby:/tmp/test% ls -l
total 0
bobby:/tmp/test% tar xf /tmp/someconfs.tar bobby:/tmp/test% ls -l
total 1
142
drwxr-xr-x |
2 ivanov |
lab5 |
1024 |
|
Mar 4 |
16:03 etc/ |
|
|
|
bobby:/tmp/test% ls -l etc/ |
|
|||
total 3 |
1 ivanov |
lab5 |
756 |
|
-rw-r--r-- |
||||
Dec 21 |
16:40 fstab |
lab5 |
1309 |
|
-rw-r--r-- |
1 ivanov |
|||
Feb 22 |
10:35 passwd |
|
|
|
bobby:/tmp/test% _ |
|
|
Tar разворачивает дерево-содержимое архива в текущей директории. Чтобы распаковать архив в другую директорию, надо или перейти в нее (командой cd) или указать ключ «-C» (распаковываем в директорию /tmp):
bobby:~% ls -l etc
/bin/ls: etc: No such file or directory bobby:~% ls -l /tmp/etc
/bin/ls: /tmp/etc: No such file or directory bobby:~% tar xf /tmp/someconfs.tar -C /tmp
bobby:~% ls -l /tmp/etc |
|
|
|
total 3 |
1 ivanov |
lab5 |
756 |
-rw-r--r-- |
|||
Dec 21 16:40 fstab |
lab5 |
1309 |
|
-rw-r--r-- |
1 ivanov |
||
Feb 22 10:35 passwd |
|
|
|
bobby:~% _ |
|
|
|
Вообще-то назначение ключа «-C» более общее, и надо хорошо себе представлять, что он
Замечание будет делать в каждом конкретном случае. Но при распаковке всего архива такое использование
достигает цели.
Обычно .tar-файлы держат упакованными (чаще всего gzip'ом). Самое простое – создать архив и затем упаковать его. Но можно указать в качестве имени архива «-»: тогда результат будет отправлен на стандартный вывод, и затем передан gzip'у, стандартный вывод которого перенаправлен в файл:
143
bobby:~% tar cf – /etc/fstab /etc/passwd | gzip >someconfs.tgz
tar: Removing leading `/' from absolute path
names in the archive |
|
|
|
bobby:~% ls -l |
|
|
|
total 1 |
1 ivanov |
lab5 |
990 |
-rw-r--r-- |
Mar 4 16:28 someconfs.tgz bobby:~% _
При использовании GNU tar (например, в Linux) есть еще более простой способ: можно указать ключ «z», который означает
«пропустить файл через gzip»:
bobby:~% tar czf someconfs.tgz /etc/fstab /etc/passwd
tar: Removing leading `/' from absolute path
names in the archive |
|
|
|
bobby:~% ls -l |
|
|
|
total 1 |
1 ivanov |
lab5 |
990 |
-rw-r--r-- |
Mar 4 16:31 someconfs.tgz bobby:~% _
Этот же ключ можно указывать при распаковке и просмотре архива.
Если сказать tar'у создать архив в той же директории, откуда берутся исходные файлы (к примеру, в текущей: «tar cf archive.tar .»), то сам
.tar-файл тоже попадет в архив – точнее, та его часть, что была создана на момент
начала добавления его самого. Предупреждение Дело в том, что tar (в отличие от Dos'о-
вских pkzip и arj) не проверяет, что файл, который он собирается поместить в архив
– это сам архив. Поэтому лучше сами фай- лы-архивы создавать вне того дерева, из которого берутся файлы, или прямо указывать список всех файлов, которые надо положить в архив.
144
Man-страница по tar довольно запутанна, поэтому лучше воспользоваться info-документацией
Совет |
(«info tar»), которая содержит разделы специ- |
|
ально для начинающих (включая tutorial'ы) |
||
|
||
|
Совместимость с Dos: zip/unzip, unarj |
zip/unzip. Для манипуляций с .zip файлами практически в любом Unix есть программы zip и unzip, совместимые с pkzip/pkunzip версии 2.04.
Поскольку ключи zip и unzip почти идентичны pkzip и pkunzip, мы не будем здесь их подробно рассматривать. Получить краткую справку можно, запустив любую из этих программ без параметров.
unarj. Для распаковки .arj-файлов есть программа unarj, совместимая с версией 2.41. В отличие от «настоящего» arj, она не умеет создавать .arj-архивы, не оптимизирована по скорости и поддерживает лишь небольшое количество опций.
Поддерживаются самые часто используемые опции arj – просмотр и распаковка, но при распаковке нет возможности указать, какие файлы надо извлекать – можно распаковать только весь архив.
Краткую справку можно получить, набрав просто «unarj» без
параметров: |
|
|
|
|
|
|
bobby:~% unarj |
|
Copyright |
(c) |
|||
UNARJ |
(Demo |
version) 2.41a |
||||
1991-93 Robert K Jung |
|
|
||||
Usage: |
UNARJ |
archive[.arj] |
(list |
ar- |
||
chive) |
UNARJ |
e |
archive |
(extract |
ar- |
|
chive) |
||||||
UNARJ |
l |
archive |
(list |
ar- |
||
chive) |
||||||
UNARJ |
t |
archive |
(test |
ar- |
||
chive) |
||||||
UNARJ x archive |
(extract with |
|||||
|
||||||
pathnames) |
|
|
|
|
145
This is an ARJ demonstration program and ** IS NOT OPTIMIZED ** for speed.
You may freely use, copy and distribute this program, provided that no fee
is charged for such use, copying or distribution, and it is distributed
ONLY in its original unmodified state. UNARJ is provided as is without
warranty of any kind, express or implied, including but not limited to
the implied warranties of merchantability and fitness for a particular
purpose. Refer to UNARJ.DOC for more war-
ranty |
information. |
|
|
ARJ Software |
Internet ad- |
||
dress |
: |
robjung@world.std.com |
CompuServe |
Robert |
and Susan Jung |
||
userid: |
72077,445 |
|
2606 Village Road West Norwood, Massachusetts 02062 USA
bobby:~% _
Поскольку unarj – имеющаяся документация – файл
/usr/doc/unarj-2.41a/unarj.doc (это обычный тексто-
вый файл).
Литература
1.Фолькердинг П., Рейчард К., Фостер-Джонсон Э. Установка и конфигурирование LINUX: учебный курс. – СПб: Издво Питер, 1999.
2.Билл Болл, Хойт Даф и др. Red Hat Linux 8/9: Настольная книга пользователя. Изд-во DiaSoft, 2004.
146
РАЗДЕЛ 9. ПРОГРАММИРОВАНИЕ В КОМАНДНОМ ИНТЕРПРЕТАТОРЕ SHELL (ОС LINUX)
Среди операционных систем особое место занимает UNIX. ОС UNIX проектировалась как инструментальная система, предназначенная для создания и отладки новых средств программного обеспечения. Она может работать практически на всех выпускаемых платформах. UNIX – это семейство открытых и мобильных операционных систем (поскольку название UNIX запатентовано компанией AT&T – различные юниксы называются различно: SCO UNIX, BSDI, Solaris, LINUX, DG/UX, AIX и т.д.).
Это не только многозадачная, но и многопользовательская система. Она обеспечивает современный пользовательский интерфейс на базе системы X WINDOW и межмашинную связь на базе протоколов TCP/IP и т.п.
UNIX спроектирована так, чтобы минимизировать число функций, реализуемых ядром системы за счет использования утилит. Все программы ОС UNIX подразделяются на два класса: програм- мы-утилиты и прикладные программы. Утилиты поставляются вместе с ОС, прикладные– создаются независимо от ОС.
ОС UNIX была создана Кеном Томпсоном и Деннисом Ритчи в Bell Laborotories (AT&T). Широко распространяться Unix/v7 (версия 7) начала в 80-х годах. Вручение создателям UNIX в 1983 г. Международной премии А.Тьюринга в области программирования ознаменовало признание этой системы мировой научной (computer science) общественностью.
1. Командный интерпретатор SHELL
Одной из самых важных программ, входящих в UNIX, является системный монитор SHELL. Это – интерактивная программа, управление которой осуществляется с помощью системы команд, которые она интерпретирует. В отличие от интерпретаторов других ОС SHELL – самая обычная программа, работающая под управлением системы (в других ОС интерпретатор – это составная часть внутренней структуры). Таким образом, командный интерпретатор SHELL – это некая командная оболочка, которая анализирует введенные команды и их аргументы, проверяет синтаксис, допустимость тех или иных ключей и только после тщательного анализа запускает соответствующую программу.
147
Командная строка в языке SHELL – это последовательность команд и аргументов, разделенных пробелами.
Для выполнения всех внешних команд SHELL порождает отдельный процесс. В рамках этого процесса выполняется программа, хранящаяся в файле, заданном именем команды. Программа может быть выполняемой, т.е. содержать машинные инструкции (интерпретируется аппаратно, с участием ядра ОС), или же она может быть SHELL-процедурой, т.е. содержать текст на языке SHELL (программу интерпретирует SHELL). Внешние отличия двух видов программ проявляются в скорости выполнения и в том, что SHELL-процедуры не нуждаются в компиляции и редактировании связей (интерпретируется сам исходный текст).
Файл, содержащий программу, может храниться в любом каталоге и иметь произвольное имя. Набор команд языка SHELL является расширяемым: его пополняет каждая новая программа, написанная пользователем. Команды делятся на внешние, которые SHELL только запускает, и внутренние, которые ему приходится выполнять самому.
Исторически существует несколько подвидов оболочек; «генеалогическое древо» представлено на рис.6.
Рис.6. Семейство интерпретаторов командной строки
Не вдаваясь в подробности истории, стоит лишь заметить, что csh и tcsh не в полной мере реализуют командный язык sh, а zsh, являясь самой последней разработкой, умеет все, что и любой другой подвид, и плюс много чего еще.
148
Кроме того, поскольку командный интерпретатор имеет десятки параметров для настройки, не следует удивляться, увидев, что некая знакомая оболочка на другом компьютере выглядит и ведет себя по-другому.
Изложение в данном разделе основано на zsh (которая и используется на практических занятиях), но большая часть описанного верно и для других оболочек.
|
Чтобы узнать, какой используется shell, надо |
Совет |
выполнить команду echo $SHELL |
|
2. Простейшие средства SHELL
Под SHELL подразумевается не только интерпретатор команд, но и более развитые языки программирования. Командный язык SHELL фактически есть язык программирования высокого уровня. На этом языке пользователь осуществляет управление компьютером. Обычно после входа в систему вы начинаете взаимодействовать с командной оболочкой. Признаком того, что оболочка SHELL готова к приему команд, служит выдаваемый ею на экран промптер (например, знак доллара $).
SHELL не является необходимым и единственным командным языком (хотя именно он стандартизован в рамках POSIX [POSIX 1003.2] – стандарта мобильных систем). Например, немалой популярностью пользуется язык cshell, есть также kshell, bashell (из наиболее популярных в последнее время) и др. Более того, каждый пользователь может создать свой командный язык; одновременно на одном экземпляре операционной системы работать с разными командными языками.
shell – это одна из многих команд UNIX, т.е. в набор команд оболочки (интерпретатора) SHELL входит команда sh – вызов интерпретатора SHELL. Первый shell вызывается автоматически при входе в систему и выдает на экран промтер. После этого вы можете вызывать на выполнение любые команды, в том числе и снова сам SHELL, который создаст новую оболочку внутри прежней.
Например, если подготовить в редакторе файл f1 echo Hello!
149
то это будет обычный текстовый файл, содержащий команду echo, которая при выполнении выдает все написанное правее ее на экран. Можно сделать файл f1 выполняемым с помощью команды chmod 755 f1. Но его можно выполнить, вызвав явно ко-
манду sh (shell): sh f1
или
sh < f1
Файл можно выполнить и в текущем экземпляре SHELL. Для этого существует специфическая команда «.» (точка), т.е.
. f1
Не начинайте командные файлы с символа #, хотя естественно начинать его с комментария. Дело в том, что такой командный файл в оболочке C-SHELL (CSH) будет интерпретирован как выполняемый в csh, в результате активизируется интерпретатор csh.
Начинайте командный sh-файл с пустой строки или пустого оператора «:».
Поскольку UNIX система многопользовательская, можно работать параллельно на нескольких экранах (переход с экрана на экран
– функциональная клавиша ALT), имея на каждом экране своего пользователя со своей командной оболочкой. В графическом режиме X WINDOW можно также открыть большое число окон, в которых может работать свой пользователь со своей командной оболочкой. СтержневымэлементомязыкаSHELL является команда.
Структура команд
Команды в SHELL обычно имеют следующий формат: <имя команды> <флаги> <аргумент(ы)>
ls -ls /usr/bin
ls – имя команды выдачи содержимого директории;
-ls – флаги ( «-» – признак флагов, l – длинный формат, s – объем файлов в блоках);
/usr/bin – директория, для которой выполняется команда.
Эта команда выдаст на экран в длинном формате содержимое директории /usr/bin, при этом добавит информацию о размере каждого файла в блоках.
150