This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
– сохранить в буфере; <S [файл]> – сохранить в файле (по умолчанию – файл «mbox»); – выполнение команды ОС не выходя из утилиты mail. После этого автоматически выводится очередное сообщение со своим заголовком и следующее за ним приглашение '?'. Если в “почтовом ящике” нет сообщений для Вас, то протокол работы с mail будет выглядеть так: $ mail No mail. $ 28
Для формирования и посылки Ваших посланий в качестве аргументов указываются входные имена пользователей-адресатов: $ mail petr11 ira ivan < Общий текст сообщения всем адресатам >$ Текст сообщения может быть передан из текстового файл так же, как и в команде write. 2.5. ГРУППА ВСПОМОГАТЕЛЬНЫХ КОМАНД Приводимые далее команды могут быть полезны для изучения и понимания ниже приводимых примеров и задач, для выполнения практикума. Некоторые команды будут рассмотрены далее более детально: сat имя_файла – вывод текста файла на экран; мore имя_файла – постраничный вывод больших файлов на экран(постраничное листание – пробелом); date [-k] – выводит системные дату и время (изменить их может только системный администратор): $ date Fri Jul 1 11:15:55 EDT 2007 $ Shell предоставляет некоторый сервис по работе с командами ОС (напр. позволяет редактировать команды, завершает автоматически набор длинных имен существующих файлов и пр.). Протокол выполненных в диалоговом режиме команд ОС хранится в специальном системном файле. Каждая строка сопровождается порядковым номером. Рассмотрим одну из таких сервисных команд, полезную при анализе протокола работы с системой: history [–n] - выводит на экран список ранее выполненных команд с параметрами и с № по порядку; history m1 m2 - выводит на экран с команды № 1 до № 2; r i - повторный запуск команды № i из протокола. 29
Пример: $ history -2 15 who 16 write $history 3 5 3 date 4 id 5 mail $r 3 < дата> $ Возможный конвейер из рассмотренных команд $history|more $ обеспечивает вывод на экран длинных протоколов. 2.6. ПЕРЕНАПРАВЛЕНИЕ ВВОДА-ВЫВОДА Одна из функций shell реализует связи процессов по данным, т.е. передачу данных от одного процесса другому. Например, если команда предусматривает вывод результатов на стандартное устройство вывода (экран), то их можно перенаправить в файл. Для обмена данными непосредственно между процессами shell использует стандартные системные файлы, которые строит сама система (программный канал): stdin — используется командами ввода данных с клавиатуры (системный файл «0»); [mail, write]; stdout — используется командами для вывода результатов на экран (системный файл «1»); [date, cat, who]; stderr — для вывода на экран протоколов при работе команд (системный файл «2»). > – команда для переадресации выходных данных в файл с заменой его предыдущего содержимого; >> – то же, но к предыдущему содержимому файла присоединяется переадресуемые выходные данные
30
$date>fil1 $date>>fil2 $>fil3 < – команда для переадресации файла вместо клавиатуры $write ira
31
3.ФАЙЛОВАЯ СИСТЕМА UNIX 3.1. ФАЙЛЫ UNIX Файл — единица информации, поименованный набор логически связанных данных (таблицы, программа, текст и пр.) Обращение к файлу по его уникальному имени (собственное имя файла), структура имени: имя_файла[.тип]. «Тип» может характеризовать стандартный тип информации, содержащейся в этом файле, его принадлежность и пр. Файлы стандартного типа строят обрабатывающие программы, которые не входят в состав ОС, а являются системным программным обеспечением. Обрабатывающие программы используются на соответствующих последовательных этапах обработки программы, написанной на одном из языков высокого уровня (например: C, Pascal, Assembler). Этап 1. Текстовые редакторы вводят текст и строят файлы с исходными текстами программ или текстовые файлы следующих типов: __________.txt __________.doc __________.___ __________.c __________.pas __________.asm В UNIX расширения имен, определяющие тип файла, не обязательны: ___________. Этап 2. Трансляторы компилирующего типа обрабатывают исходные тексты программ и строят промежуточные файлы объектного типа: __________.o Объектные файлы — это разрозненные файлы, не имеющие между собой межмодульных связей и абсолютных адресов, т.е. они не настроены для исполнения в оперативной памяти компьютера (ОП). 32
Этап 3. Библиотекари — объединяют несколько объектных файлов в единый объектный с целью сокращения перечисления модулей программ при последующей обработке: ________.a Этап 4. Редактор межмодульных связей (компоновщик) — вычисляет все межмодульные адреса программы в целом, тем самым строит единый программный модуль, содержащий только относительные адреса. Эта форма программы — загрузочная форма — имеет стандартное имя файла: a.out Этап 5. Загрузчик программы в оперативную память (входит в состав ОС) для исполнения. Загрузочная форма текста программы размещается в выделенной супервизором памяти области оперативной памяти (виртуальной памяти) и управление передается в первый байт. Таким образом, процессу данной задачи выделяется квант процессорного времени. Например, протокол формирования, компиляции и выполнения некоторой С-программы может иметь следующий вид: $cat fil.c <набор текста программы в файл fil.c> $cc fil.c <компиляция текста программы в объектную форму fil.o> $lib fil.o <формирование многомодульной программы библиотечной формы fil.a> $link fil.a <редактирование межмотульных связей, формирование единой программы загрузочной формы a.out> $a.out <загрузка программы и исполнение> Независимо от системы программирования все прикладные задачи проходят эти стадии обработки. В интегрированных системах программирования просто эти этапы скрыты от конечного пользователя, и протокол работы с ОС может иметь следующий вид: $cat fil $fil.c Факт работы обрабатывающих программ можно определить по наличию исходного имени файла программы со стандартными расширениями в текущем каталоге. 33
Все обрабатывающие программы в процессе своего выполнения формируют собственный протокол работы в файл:___________.lst Все файлы имеют собственные описатели (дескрипторы) и хранятся во внешней памяти. Физические адреса файлов на внешней памяти концентрируются в специальных файлах — каталогах. В каталоги включаются также описатели файлов и описатели самого каталога, так как каталог — тоже файл. 3.2. ГЕНЕРАЦИЯ ИМЕН ФАЙЛОВ Это одна из функций shell, позволяющая: сократить время набора имени файла или списка имен; выполнять однотипные операции (команды ОС) сразу над группой файлов. При необходимости экономного перечисления в командной строке нескольких файлов, имеющих частично совпадающие имена, могут быть использованы так называемые метасимволы: ? — для замещения одного символа; * — для замещения любой цепочки символов; исключение составляют имена файлов, начинающиеся с точки: шаблон, совпадающий с ними, должен обязательно иметь точку в начале; [ ] — диапазон для замещения одного символа, совпадающего с одним из перечисленных в квадратных скобках, например: file[357] — совпадает с каждым из имен: file3, file5, file7; file[3-7] — совпадает с каждым из имен: file3, file4, file5, file6, file7. При интерпретации метасимволов shell генерирует список всех реально существующих в системе файлов, имена которых так или иначе совпадают с указанным шаблоном. Если шаблон содержит путь к файлу, то в список попадут только файлы из указанного каталога, по умолчанию — из текущего каталога. Примеры: * — все имена, кроме тех, которые начинаются с точки; *.c — все имена с расширением .c ; [abc]* — все имена, начинающиеся на a, b и c; [a-c]* — эквивалентно предыдущему примеру; 34
ch??k — все имена из пяти символов, включающие явно указанные на тех же самых позициях, что и в указанном групповом имени. В UNIX имеется дополнительная возможность защиты файлов от несанкционированного доступа посредством использования скрытых имен файлов — “скрытые файлы”. Имена скрытых файлов должны начинаться с точки: .____________ — имена скрытых файлов и их описатели в каталогах можно посмотреть только используя специальную опцию в команде распечатки листинга каталога (ls -al ). — см. ниже. 3.3. СТРУКТУРА СИСТЕМЫ КАТАЛОГОВ UNIX Структура системы каталогов UNIX строится в иерархической системе внешней памяти на блочных устройствах.
Рис. 3.1. Структура каталогов UNIX: 1 – коренной каталог системы (строится при инсталяции ОС); 2 – системные каталоги (инсталяция); 3 – каталоги группы пользователей (определяет администратор); 4 – головные (личные) каталоги пользователей (строятся при авторизации — HOME-каталоги); 5 – рабочие каталоги и файлы пользователей
35
Некоторые системные каталоги: vmunix — ядро ОС; bin — утилиты оболочки; mail — файлы электронной почты; dev — файлы устройств; tmp — адреса рабочих пространств памяти пользователей, выделяемых супервизором памяти ОС по запросам системных вызовов из программ пользователей; etc — файлы администратора; home — данные головных каталогов всех пользователей системы. В UNIX используется простой способ описания пути к файлу в иерархической системе каталогов — полное маршрутное имя файла (абсолютное маршрутное): $ cat /home/user/lev/f1 относительные маршрутные имена файлов: от головного каталога группы пользователей user/lev/f1; от головного (личного) каталога пользователя f1 или lev/f1; от текущего (рабочего в данный момент) каталога; " . " — системное имя текущего каталога (скрытый файл); " .. " — системное имя вышележащего каталога (скрытый файл). Например: если текущий lev – то маршрутное имя файлов: ./f1, или f1, или ./lev1/fil2, или lev1/fil2; если текущий lev1 — ./fil2, или fil2, или ./f1, или ../../ira/filira 3.4. УПРАВЛЕНИЕ КАТАЛОГАМИ В UNIX Каталоги — средство организации файлов. Управление каталогами осуществляется средствами командного языка ОС: просмотр структуры и содержания системы каталогов; создание и удаление каталогов; поиск файлов в системе каталогов. 36
При работе с файлами пользователь всегда находится в одном из каталогов, который называется текущим. Для того чтобы определить, какой каталог является в настоящее время текущим, можно запросить абсолютное полное маршрутное имя текущего каталога: pwd — печать полного маршрутного имени текущего каталога $ pwd /home/user/lev $_ Для просмотра содержимого листинга каталога служит команда: ls [-ключи] [имя_каталога] Ключи используются для определения формата выдачи: -l — полный (длинный) формат выдачи, перед ним суммарный размер всех перечисленных файлов в килобайтах; total 127 -а — вывод полного списка файлов, включая скрытые, т.е. имена которых начинаются с точки (в том числе файлы . и ..); -C — вывод имен файлов в несколько колонок с сортировкой по алфавиту вдоль колонок; и т.п., всего 27 опций. $ ls -al total 14 drwxrwxrwx 4 lev user drwxrwxrwx 11 root root -rwxr-xr-x 1 lev user drwxrwxrwx 3 lev user $
496 Mar 13 13:07 176 Feb 23 13:47 152 Mar 13 13:07 32 Apr 4 14:52
. .. f1 lev1
Здесь необходимо обратить внимание на то, что любой каталог также является файлом типа "d" с соответствующими правами доступа. Без ключей команда выводит отсортированные по алфавиту имена файлов и каталогов по одному имени на каждой строке.
37
Элементы каталога (слева направо): тип файла (“-“ — обычный, d — каталог , g — сетевой, p — файл программного канала); - c — файл символьного (байториентированного) внешнего устройства (принтеры, графические устройства и т.д.); символьные коды прав доступа к файлам (r,w,x); число ссылок на файл (число связей): минимум 1 — для файла, 2 — для каталога; владелец файла; символьный идентификатор группы пользователя; размер файла в байтах; время и дата последней модификации файла; собственное имя файла. Стандартный вывод команды можно переадресовать в файл: $ ls>fildir $ или присоединить к существующему файлу: $ ls>>fildir $ В текущем каталоге можно размещать как новые файлы, так и новые каталоги, являющиеся подкаталогами по отношению к текущему каталогу. Для создания одного или нескольких подкаталогов применяется команда: mkdir [-ключи] имя_нового_каталога1 [имя-кат2] — создание каталогов. -p — создается промежуточный подкаталог, до этого не существовавший (таким образом можно создавать сразу цепочку каталогов). Вновь созданный каталог не будет абсолютно пустым. Он будет содержать два элемента с символьными именами "." и "..". Пример: $ mkdir dirа $ mkdir dirb $
38
В текущем каталоге lev создано два подкаталога dira и dirb со стандартными значениями атрибутов защиты: $ ls -l drwxr-xr-x 2 lev user 32 Mar 4 14:52 dira drwxr-xr-x 2 lev user 192 Mar 9 12:53 dirс Команда mkdir может быть использована и для создания нижележащих подкаталогов по их маршрутным именам непосредственно из текущего каталога (lev): $ mkdir dirb/dirc $ ls -l dirb drwxr-xr-x 2 lev user1 196 Mar 9 12:53 dirb $ ls -l dirb/dirc total 0 $ Для исключения набора длинных маршрутных имен файлов любой каталог может быть объявлен текущим с помощью команды cd [полное_имя_каталога] — смена текущего каталога на указаный $ cd /home/user/lev/dirb/dirc $ pwd /home/user/lev/dirb/dirc $ Еще пример: $ cd ../../dira $ pwd /home/user/lev/dirа $ Пример создания сразу нескольких новых подкаталогов относительно объявленного текущим каталога dira: $mkdir -p dird/d1 dird/d2 — одновременно создается несуществующий промежуточный подкаталог dird. Команда cd без аргументов восстанавливает в качестве текущего начальный (головной) каталог пользователя: $ cd $ pwd /home/user/lev $_ 39
Есть некоторые особенности использования команды ls для просмотра содержимого текущего каталога (для вышеприведенной иерархической схемы каталогов): $ls . – вариант с «точкой» выводит только имена всех файлов и подкаталогов текущего; dira dirb $ls * – вариант «все» дополнительно выводит содержимое из нижележащих подкаталогов, но только первого уровня; dira dird dirb dirc $ Интенсивная работа в системе требует периодической чистки поддерева каталогов пользователя. Для этих целей используются две команды: rm список_файлов — удалить указанные файлы; rmdir список_каталогов — удалить пустой подкаталог. Процедура чистки требует некоторой обязательной последовательности действий: - удалить все файлы в удаляемом каталоге командой rm; - удалить сам подкаталог с помощью команды rmdir. Но существуют некоторые особенности выполнения этих действий: - без ключей удаляется только один последний каталог в пути; - действие удаления файлов и самого каталога требует наличия у пользователя прав записи (кода - w) в этот каталог; - текущий каталог не должен принадлежать поддереву удаляемых каталогов (т.е. невозможно удалить текущий каталог); - если удаляемый файл защищен от записи, то команда rm запрашивает подтверждение на удаление файла. Назначение некоторых ключей: - ключ -i команды rm вводит необходимость подтверждения для каждого удаляемого файла; 40
- ключ -f команды rm отменяет необходимость подтверждения для любого удаляемого файла; - ключ -r задает режим рекурсивного удаления всех файлов и подкаталогов данного каталога, а затем и самого каталога, но лучше использовать ключ -i, иначе можно потерять все файлы. Все три ключа команды rm могут использоваться в любых сочетаниях. Например: $ rm -ir /home/user/lev/dira #требует подтверждения на каждый удаляемый файл $ 3.5. КОМАНДЫ ПОИСКА ФАЙЛОВ В СИСТЕМЕ КАТАЛОГОВ Команды позволяют находить и обращаться к файлам по указываемым в командах свойствам файлов, которые, в свою очередь, определяют условия поиска файлов. find <список_каталогов>< условия_поиска> — определение полных имен файлов в поддереве каталогов, удовлетворяющих заданным условиям поиска. В команде может быть задано до 18 <условий_поиска>. Необходимые комбинации условий объединяются в булевское выражение с помощью элементарных логических операций (элементарных логических функций). Таким образом, формируется логическая функция, принимающая истинное значение, если значения всех её составляющих истинны. На экран выводятся полные маршрутные имена файлов, свойства которых обеспечивают истинность этой функции: ! <условие> <пробел> -o \( выражение \)
— отрицание условия; — соответствует операции "И"; — операция "ИЛИ"; — булевское выражение в скобках.
41
При описании команды используются обозначения: n — положительное десятичное число; -n — любое положительное десятичное число, строго меньшее n; +n — любое положительное десятичное число, строго большее n. Условия задаются следующими опциями: name'имя_файла' — истинно для файлов с указанным именем; perm <8-ричный_код> — истинно для файлов с указанным кодом прав доступа; type {f|d|b|c|p} — истинно для файлов указанного типа; links n — истинно для файлов с числом ссылок n; user <имя_пользователя> истинно для файлов, принадлежащих данному пользователю; size n[c] — истинно для файлов с длиной n (число блоков – 1 блок = 512 байт) или с – в символах (байтах); exec <команда> {} \; — истинно, если команда возвращает нулевой код завершения (true); выполняет <команда> для каждого найденного файла. Все аргументы команды find разделяются пробелами: $ find lev -type f -links +1 Выводятся на экран полные маршрутные имена всех обычных файлов головного каталога и его подкаталогов, на которые имеется более одной ссылки. Поиск в головном каталоге и во всех нижележащих с выводом листинга атрибутов каждого из найденных файлов: $ find * -type d -links +3 -exec ls -al {} \; где {} – “подстановка”, т.е. команда, указанная в скобках будет выполняться для каждого из найденных файлов, имена которых будут подставлены вместо фигурных скобок: $ find /dev \( -type b -o -type d \) Выводятся имена каталогов или специальных файлов устройств блок-ориентированного типа из каталога /dev и его подкаталогов. Пример иллюстрирует форму выходной информации: $ find * -type d, 42
где * — поиск в текущем [.] и во всех нижележащих каталогах [*]. ./ira ./petr ./lev1/lev11 $ Команду можно использовать для поиска файлов по их имени или даже по части имени. Например, $find / \(-name “fil.*” –o –user petr –exec cat {} \;\). Команда выводит на экран список файлов, имена которых включают указанные шаблоны. Некоторые версии UNIX требуют заключения в кавычки или блокирования специальных символов. В данном случае – * и ( ). Все рассмотренные команды этой группы имеют инвариантное применение для файлов всех типов, независимо от их назначения и содержания. grep [-ключи] 'шаблон' <список_файлов> — поиск в файлах из списка_файлов строк, содержащих указанный шаблон (подстрока символов). Ключи определяют режимы поиска и вывода: c — выводятся имена всех просмотренных файлов и количество найденных строк, содержащих шаблон; n — перед каждой строкой выводится ее относительный номер в файле и сама строка; i — игнорируются регистры; l — выводятся только имена файлов, содержащие найденные строки, и др. Примеры: $ grep -c 'aaa' * f.1: 10 f.2: 3 f.3: 1 $ В рассмотренном примере выводятся все имена файлов текущего каталога, содержащих подстроку aaa, и количество таких строк в каждом из них: 43
$ grep -l aaa * f.1 f.2 f.3 ... $ В отличие от предыдущего случая, выводятся только имена файлов, содержащих строки с шаблоном aaa: $ grep -n bbb * f.1: 5: aaaaaabbbbaaacc f.2: 2: bbbbbbbbbbbbbbbbbbbb f.6: 1: bbb $ Команда имеет много опций и богата возможностями для самых разных применений. Например, для поиска файлов или строк файлов по различным сочетаниям ключей (опций), с использованием регулярных выражений для описания условий поиска. 3.6. УПРАВЛЕНИЕ ФАЙЛАМИ sort — алфавитная и числовая сортировка файлов или строк файлов; режим сортировки определяется ключами. Команда многофункциональная, предусматривает много режимов сортировки. Неполные возможности команды: $sort [-k номер-поля-в-строке] [список-файлов] d — по алфавиту (или по умолчанию); n — числовая; u — исключает повторяющиеся строки и т.д. Примеры: $sort [*] текст вводится со стандартного устройства ввода (0) mmm bbbb aaaaaaaa bbbb mmm 44
$sortfilwho $sort -n 5 filwho — cортировка по началу сеансов работы пользователей. touch — замена времени модификации на текущее, если файл не существует, то создается новый пустой файл. touch [-k] имя-файла Команда может использоваться для создания новых пустых файлов. Пример: $touch fil $ls -l ........... .......0 10:12
fil
Следующая команда позволяет выполнить подсчет количества строк (-l), слов (-w), или символов (-c) в указанных файлах: wc [-lwc] список_файлов. Ключи l, w, c могут употребляться в любых комбинациях и в любом порядке, по умолчанию — lwc. Если не указано имя файла, то команда обрабатывает текст, введенный со стандартного устройства ввода (0): $ wc f.ddd 3 5 31 f.ddd $ В примере файл f.ddd содержит 3 строки, 5 слов и 31 символ. Пустой файл для последующего использования можно открыть так: $ > fil.1 $ ls -l fil.1 -rw-rw-rw- 1 lev $
user1
0 Mar 19 18:17
fil.1
Смысл команды заключается в переадресации в fil.1 пустого значения стандартного устройства ввода. Новый пустой файл автоматически создается в текущем каталоге. 45
Наиболее часто используемая команда для обработки файлов: cat [-ключи] [входной_файл1[ входной_файл2 ...]] — слияние и вывод файлов на стандартное устройство вывода (конкатенация файлов). Команда богата функциональными возможностями даже без использования ключей. Рассмотрим наиболее полезные из этих возможностей, используя два пустых файла: fil.1 и fil.2. Здесь и далее приводятся примеры протоколов работы с системой в предположении, что все файлы размещаются в текущем каталоге: $>fil.1 $>fil.2 $ cat > f # в файл f помещается текст, набираемый # пользователем на клавиатуре терминала [0]. text$ ls f fil.1 fil.2 $ cat f > fil.1 # содержимое файла f копируется в # файл fil.1, оставаясь также в f $ cat fil.1 text $ cat f fil.1 > fil.2 # два файла: f и fil.1 сливаются в один fil.2 $ cat fil.2 text text $ cat f fil.1 >> fil.2 # к содержимому fil.2 добавляется fil.1 и f $ cat f fil.2 text text text text text 46
Команда копирования файлов: cp [-k] вх_файл_1 [вх_файл_2 [... вх_файл_n]] вых_файл. В самом формате команды заложено два режима ее использования: Режим 1. Если вых_файл — обычный файл, то вх_файл может быть только один; в этом случае содержимое вх_файла копируется в вых_файл. Если вых_файл существовал, то его содержимое полностью заменяется на новое, атрибуты защиты сохраняются. Если создается новый вых_файл, то ему присваиваются атрибуты копируемого. Режим 2. Если вых_файл — каталог, то в него последовательно копируются все указанные вх_файлы со своими атрибутами и именами, но каталог при этом автоматически не создается. Примеры: $cd $ cp fil.c FIL.c Создается новый файл FIL.c в том же текущем головном каталоге. Для копирования в другой каталог необходимо указать маршрутное имя выходного файла: $ mkdir petr $ mkdir lev1 $ cp fil.c lev1/prog.c В том и другом случаях входной файл fil.c сохраняется в исходном текущем каталоге: $ cp fil.c FIL.c lev1/prog.c petr $ ls petr fil.c FIL.c prog.c $ В подкаталог petr параллельного поддерева скопируются последовательно три входных файла, имеющие одинаковое содержание и разные имена. На следующем, не связанном с предыдущим примере вспомним, 47
как можно использовать групповые операции над файлами при копировании: $ cp f.? fildir $ cp f.[1-3] fildir $ cp f.[123] fildir Во всех трех случаях копирования выполняется одна и та же операция (входных файлов всего 3). Некоторые ключи: -i — вывод предупреждения, если вых_файл уже существует и его содержимое может быть заменено; -r — для копирования каталогов. Отметим еще раз, что команда копирования cp сохраняет неизменными входные (копируемые) файлы. Схожие с командой cp функции выполняет команда: mv [-k] вх_ф йл_1 [вх_ф йл_2 [... вх_ф йл_n]] вых_ф йл — перемещение или переименование файлов Отличия от предыдущей команды копирования заключаются в том, что перемещаемые файлы в исходном каталоге уничтожаются. Пример. Предположим, что существует некоторый подкаталог "a" (относительно текущего) со своими файлами: $ ls a f1 f2 f3 $ mv a/f? $ ls -l a total 0 $ ls ... f1 f2 f3 $ Эту команду можно рассматривать как переименование файла. При этом для пользователя исходная копия файла теряется, новая 48
копия приобретает новое имя и все значения атрибутов исходного входного файла: $ mv f1 newf1 — файл переименован в том же текущем каталоге. Надо отметить, что фактического перемещения кодов файлов по пространствам памяти не происходит, а пересчитываются только адресные ссылки на файлы. Операционная система UNIX предоставляет пользователям возможность использовать общие файлы или использовать один и тот же файл под разными именами и из разных каталогов. Это обеспечивается за счет установления физических адресных ссылок на общий файл из разных каталогов. Организация новых ссылок на файл выполняется системой по команде: ln [-k] вх_файл_1 [вх_файл_2 [... вх_файл_n]] вых_файл. В формате команды заложены два режимa ее использования: Режим 1. Если вых_файл — обычный файл, то допускается только один вх_файл_1; в этом случае на него создается ссылка с именем вых_файл (имя каталога определяется по составу имени вых_-файл ), после чего к упомянутому файлу можно обращаться по двум равноправным именам: вх_файл_1 и вых_файл. Количество ссылок на файл в его описателе увеличивается на 1. Режим 2. Если вых_файл — каталог, то в нем создаются элементы, включающие имена перечисленных в команде входных файлов и ссылки на них, после чего в каталоге вых_файл можно работать с этими файлами, как с файлами этого каталога. Рассмотрим использование команды на примерах (рис. 3.2). $ pwd / /lev $ cd d1 # назначение текущим каталогом d1 $ ls ../d2 # исходное состояние параллельного каталога d2 f21 f22 f23 $ ln ../d2/f21 f1 49
$ ln ../d2/f21 $ ls # новое состояние текущего каталога f1 f21 $ ln d2/* $ ls # результирующее состояние текущего каталога d1 f1 f21 f22 f23 $
lev
d1
d2 f21 f22 f23
f1 f21 f22 f23
Рис. 3.2. Пример созданных в задаче ссылок
В каталоге d1 созданы элементы, содержащие ссылки на все существующие файлы каталога d2. Рассмотрим ещё два примера: $ln a/b c/d — создаётся адресная ссылка d на файл b в параллельных каталогах a и b; $ln a b ../c — в вышележащем каталоге с созданы две адресные ссылки на два файла в текущем каталоге. 50
Обобщение свойства команды ln: каждая ссылка на входной файл добавляет +1 к числу ссылок входного файла; все связанные файлы имеют совпадающие описатели в каталогах; если изменяется содержимое одного из связанных файлов, то меняется содержимое всех связанных файлов, так как связанные файлы разделяют одни и те же данные на диске; если удалить один из связанных файлов, то сокращается число взаимных ссылок на -1. 3.7. УПРАВЛЕНИЕ ПРАВАМИ ДОСТУПА К ФАЙЛАМ И КАТАЛОГАМ Каждый файл принадлежит конкретному пользователю. Владелец файла имеет абсолютный приоритет над другими пользователями системы, которые в принципе потенциально могут иметь доступ к этому же файлу. Владельцу предоставлены средства командного языка, позволяющие разрешать или запрещать доступ к своим файлам и каталогам. Права процессов пользователей при доступе к файлу кодируются в атрибутах защиты файла. Атрибуты сопровождают каждый файл, хранятся в описателях файлов, на которые в каталоге имеются ссылки, и доступны для анализа и изменения посредством специальных команд ОС UNIX. Атрибуты защиты файла определяют права доступа трем видам процессов: процессам пользователя — владельца файла (u — user), процессам группы владельца файла (g — group), процессам остальных пользователей (o — other), не попавших ни в одну из двух предыдущих категорий. Код атрибутов прав доступа пользователей трех перечисленных категорий для каждого файла отображается в полном листинге каталога символьным кодом в виде комбинации следующих символов: r — разрешение на чтение файла или на выполнение процедуры, для каталога — просмотр содержимого каталога (только список всех файлов); w — разрешение модификации или удаления файла, для каталога — включение или удаление файлов; 51
x — разрешение выполнения файла (совместно с - r), для каталога — поиск по каталогу конкретных отдельных файлов, сделать каталог текущим, разрешение на включение каталога в маршрутное имя. Например, полный листинг каталога /udd/user1/lev может иметь следующий вид: -rwxr-xr-x 1 lev drwxr-xr-x 2 lev
user1 user1
171 Mar 4 14:20 32 Mar 4 14:51
fil1.c hh
Здесь файл fil1.c, владельцем которого является пользователь со входным именем lev, является обычным, содержит исходный текст программы на языке Си длиной 171 байт, доступен владельцу для чтения, записи и выполнения; членам группы и прочим пользователям — только для чтения и выполнения. Директория hh защищена для включения новых и удаления существующих файлов. Для изменения значений кодов защиты только указанных в команде файлов служит команда chmod <коды защиты> <список_файлов> Коды защиты (r, w, x) могут быть заданы только владельцем файла в символьном или числовом виде. Атрибуты задаются для владельца (u), его группы (g) и остальных пользователей (o) или для всех категорий пользователей одновременно (a). Над символьными атрибутами защиты можно выполнять три следующие операции отдельно для владельца, для группывладельца и для всех остальных пользователей: = — присвоить значения кодов доступа (замена существующих); + — добавить значения кодов доступа; - — отобрать права доступа. Необходимо отметить, что новый файл обычно создается по умолчанию как невыполняемый, со стандартным набором прав доступа: rw-rw-rw- — для файла; rwxrwxrwx — для каталога.
52
Например, необходимо сделать некоторый файл shproc1 выполняемым, если он был создан как обычный. Для этого можно использовать команду chmod: $ chmod u+x shproc1 $ shproc1 < Выполнение программы из файла shproc1 > $ Эти действия необходимы, в частности, при формировании и выполнении shell-процедуры. Пример: $ ls -l f1 -rw-rw-r-- ....................... f1 $ chmod ug+x,o-r f1 $ ls -l f1 -rwxrwx--- ........................ f1 $ Пример: $ chmod u+w,go+x f2 $ chmod u=rw,g=r f3 $ chmod a+rx f1 — в данном случае файл f1, благодаря одновременному заданию прав rx, становится доступным для исполнения всем пользователям; $ chmod a=rwx f2 — предоставляются все права всем категориям пользователей. Числовые значения кодов защиты кодируются трехразрядным восьмеричным числом, где существование соответствующего кода соответствует наличию единицы в двоичном эквиваленте восьмеричной цифры этого числа, отсутствие атрибута — нулю. Например: Символьное представление: rwx r-x r-Двоичное представление: 111 101 100 Восьмеричное представление: 7 5 4 Поэтому следующая команда: $ chmod 0754 f3 эквивалентна, в частности, команде $ chmod u=rwx,g=rx,o=r f3. 53
В результате выполнения команд в любой из приведенных форм коды доступа файла f3 приобретут следующий вид: $ ls -l f3 -rwxr-xr-- ....................... f3 $ Таким образом, файл f3 является выполняемым для владельца и группы, чтение его разрешено всем пользователям, модифицировать файл может только владелец. Подчеркнем еще раз, что для выполнения файл должен иметь права доступа r и x. $ chmod 000 f4 — отмена всех прав доступа. Примеры: $chmod -w fout # запретили прямое удаление файла fout $rm fout fout: mode? Y # файл удаляется только при подтверждении удаления $chmod -w . # запретили модификацию текущего каталога, # для chmod текущий каталог указывать обязательно в явном # виде (здесь — точкой) $rm fout <удаления нет> Примеры управления правами доступа к каталогам: $chmod a-rwx, u=rw dir1 $cd dir1 bash:cd:dir1:Permission denied # каталог dir1 не может быть сделан текущим, так как нет права # х для каталога; $ls dir1 # просмотр каталога разрешен, так как есть право r; f1 f2 $ls -l dir1/* # поиск конкретных отдельных всех файлов“*”; <файлы не найдены> 54
# так как не разрешен поиск по каталогу, не указано право х; total 0 $cat dir1/f1 <файл не найден> # то же для конкретного файла f1; $ Еще пример: $chmod u=wx dir2 $ls dir2 # это каталог, а не обычный файл; bash:ls:dir1:Permission denied # так как нет разрешения на просмотр каталога; $cat dir2/ff <тект файла> # так как есть право х — поиск по каталогу и назначение его # текущим; $cd dir2 $pwd /home/lev/dir2 $ Некоторые правила: - все каталоги, входящие в полные маршрутные имена файлов, должны иметь права на выполнение (х); - с целью защиты файла от удаления надо отобрать право (w) как у файла, так и у каталога, в котором находится файл. Стандартные значения кодов прав доступа устанавливает администратор системы. Однако пользователь в ksh, bash может изменить временно (до конца сеанса работы) значение кодов защиты для всех своих новых файлов с помощью команды установки маски: $umask [-r] <режим-доступа> Собственно маска — это двоичный код, с этим кодом и двоичным кодом защиты, установленным ранее, выполняются некоторые логические операции: в результате операции вычисляются новые коды защиты. В ksh и bash возможно символьное представление кодов защиты в umask, а собственно численное значение маски 55
просчитывается системой автоматически и используется для вычисления результирующих заданных в команде кодов: ключ -S — выводит на экран текущие символьные значения кодов; без ключа — команда выводит численное значение маски. Пример изменения прав доступа для некоторого файла с использованием команды umask: -rw- rw- rw-.............................. ...............f5 $umask g=r, o= f5 $ls –l f5 -rw- r-- ---...... ..........................................f5 $ Пример: $touch testfil1 $ls -l testfil1 -rw- rw- rw- ............... ............0 <11:08> $umask a-rwx, u=rw, g+r # эти права будут иметь все новые файлы; $umask -S u=rw, g=r, o= $umask 137 # численное значение текущей маски; $touch testfil2 $ls -l testfil2 -rw- r-- --0 <11:12> testfil2 # новый файл
testfil1
Ниже приведенный пример иллюстрирует, как работает команда mesg. Вспомним, что терминал пользователя — это тоже файл, т.е. обрабатывается как файл типа "с" – устройство с байтовым (посимвольным) обменом информацией: $who am i lev tty3 # tty3 имя терминала пользователя; $mesg y $ls -l /dev/tty3 crw- -w- -w- ......lev user <> /dev/tty3 56
# это файл терминала; $mesg n $ls -l /dev/tty3 crw- --- ---.................lev user <> /dev/tty3........................................... Команда mesg обращается к утилите chmod для файла устройства с целью добавления или отъема прав на запись (w) для членов группы и остальных пользователей. Именно этим достигается блокирование и разблокирование возможности вывода на данный экран сообщений других пользователей. Имеются и другие возможности управления правами доступа. Рассмотрим еще две команды. Рассматриваемые ниже функции может выполнять только владелец файла или администратор. chown – владелец передает права владения данным файлом другому пользователю или группе. $chown нов_владелец имя_файла Пример: $cp f1 /home/ira/f1 $ls -l /home/ira/f1 -rw- r-- --- 1.......lev.....user...< f1 # владелец копии — lev; $chown ira /home/ira/f1 # смена владельца; $ls -l -rw- r-- --- 1.......ira......user...<> f1 # владельцем копии файла стала ira, но читать (r) копию может # и lev как член общей группы. Также можно сменить и группу. chgrp — передача прав другой группе (сменить группу). $chgrp нов_группа имя_файла Пример: $ls -l f2 -rw- r-- --- ...................lev user <> $chgrp class f2 57
f2
$ls -l f2 -rw- r-- --- .................lev class <> f2 # сменили группу, но владелец как член новой группы также # имеет права доступа к файлу; $chown serg f2 -rw- r-- --- ................serg class <> f2 # сменили владельца в новой группе. Старая группа переходит # в разряд (о). Предыдущий владелец переходит в разряд (g). В UNIX имеются более сложные и гибкие средства управления правами доступа, в частности, изменение идентитфикаторов пользователей и групп, списки управления доступом и пр. В основном это средства администратора. Развитость средств защиты файловой системы является ещё одной из причин того, что UNIX является базовой операционной системой компьютерных сетей. Вопросы для самоконтроля 1. Файлы операционных систем. Структуры имен ОС UNIX. Стандартные расширения имен файлов. 2. Последовательность подготовки и выполнения программ в среде ОС UNIX. Стандартные расширения имен файлов обрабатывающих программ. Примеры. 3. Генерация имен файлов. Назначение. Примеры. 4. Структура системы каталогов UNIX. Назначение каталогов различного типа. 5. Разновидности маршрутных имен файлов. Примеры. 6. Структура листинга каталога ОС UNIX. Средства командного языка для управления листингом. Примеры. 7. Средства и возможности командного языка ОС UNIX для управления каталогами. Примеры. 8. Команды поиска файлов в системе каталогов ОС UNIX.Возможности формирования условий поиска. Примеры. 9. Средства командного языка для поиска строк и файлов по содержимому строк в ОС UNIX. Примеры. 10. Обзор команд управления файлами ОС UNIX. Примеры.
58
11. Возможности команд по конкатенации, созданию, формированию и отображению текстовых файлов на стандартом устройстве вывода. Примеры. 12. Особенности применения команд копирования и перемещения файлов в системе каталогов ОС UNIX. Примеры. 13. Назначение и возможности команды организации ссылок на файлы. Примеры. 14. Права доступа к файлам и каталогам в ОС UNIX. Кодирование прав доступа. Примеры. 15. Команды управления правами доступа к файлам и каталогам в ОС UNIX. Особенности применения. Примеры. 16. Средства командного языка ОС UNIX для передачи прав доступа. Примеры.
59
4. КОНВЕЙЕРЫ И ФИЛЬТРЫ Операционная система UNIX обеспечивает обмен информацией (управляющей и прикладной) между процессами. Обмен данными между процессами осуществляется через программный канал. По сути, это некоторый системный файл, в который одна команда пишет информацию, а другая — читает. Если команды считывают информацию со стандартного буферного системного файла ввода (stdin) и направляют в стандартный буферный файл вывода (stdout), то такие команды могут быть объединены в единую командную строку – конвейер. Конвейер позволяет использовать вывод одной команды в качестве ввода другой. Конвейер по сути это программный канал для создания потока данных от команды к команде. Программный канал создается автоматически интерпретатором shell при обнаружении в командной строке команд, связываемых специальным символом “|” (вертикальная черта): команда_1 | команда_2 | команда_3 | ... | команда_n Конвейер представляет собой технологическую цепочку обработки исходной информации. Пример: $ ls > buffile $ wc -l < buffile 20 $ rm buffile $ Эта же задача может быть решена проще и более компактно с использованием конвейера: $ ls | wc -l $ Конвейер можно использовать для формирования новых команд и дальнейшего их многократного выполнения: $cat>count who/wc –l$chmod 711 count $count ……… $count ……… $ 60
Если команда в конвейере не меняет или сокращает передаваемую информацию, то такие команды называются командамифильтрами. Пример: $ ls -l| grep ‘Мar’|wc -l вывод на экран числа строк текущего каталога, содержащих подстроку "Мar" (подсчитывается число файлов, модифицированных в марте). Пример: $who>fil $sortf2 Если при решении задач возникает потребность отображения результатов одновременно на нескольких внешних устройствах, то это обеспечивает команда-тройник: tee [-ключи] файл — дублирование стандартного вывода (экран) в указанный файл. Ключи: -i — игнорирование прерываний, что обеспечивает непрерывность вывода; -a — содержимое ввода добавляется к существующему файлу в его конец (накопление данных); если указанный файл не существует, то создается новый с указанным именем и в него записывается результат работы команды tee.
61
Пример: $ ls -l | tee -a fil.res Конвейер обеспечивает вывод содержимого каталога на экран и добавляет эти данные к содержимому fil.res. Пример: $ ls -l | tee fil | wc -l 20 $сat fil # содержимое файла можно просмотреть на экране. Полный листинг каталога выводится в файл fil, а число строк в каталоге — на экран (на стандартный вывод). Однако вывода каталога на экран в данном случае не будет, так как выходной поток команды ls после команды tee перенаправляется опять в конвейер (для команды wc). Пример: $find . -type d|tee fil|wc -l — подсчет числа подкаталогов в текущем каталоге и вывод их полных маршрутных имен в файл fil. Рассмотренные возможности использования программных каналов сильно расширяют возможности командного языка операционной системы. Устойчивые языковые конструкции, введенные для специальных целей, являются, по существу, новыми командами. Еще одна команда-фильтр вырезает и объединяет указанные элементы строк символов входного потока и выводит результат на экран: $cut -k [имя_входного_файла] если имя входного файла не указано, то входной поток поступает со стандартного устройства ввода (клавиатура) или из программного канала. Некоторые ключи (эти два ключа используются совместно): -f<список_номеров_полей_в_строке_файла> — в выходной поток передаются только указанные поля, разделенные символьными разделителями; -d<вид_разделителя_полей_в_строке_файла> — примеры разделителей: ‘;’ или ‘:’ или ‘ ’ , по умолчанию — табуляция. 62
Если указанный в ключе разделитель не найден, то в стандартный выходной поток передается строка целиком. -b<число_байтов_или_выражение_для_подсчета числа> — побайтовое вырезание полей из строк входного потока и направление их в выходной поток; -c<число_символов_или_выражение> — посимвольное вырезание полей из строк входного потока и направление их в выходной поток. Несколько не связанных между собой примеров использования команды: $сut -f1 -d’:’ /etc/passwd — формируется и выводится на экран список зарегистрированных пользователей; $who|cut -f1 -d’:’ |tee filuser — то же и дополнительный вывод в файл $cat /etc/passwd|cut -d’:’ -f1; $ls -l|cut -b-15 — вырезаются байты с первого по пятнадцатый, и выводит на экран только первые 15 байтов каждой строки листинга; $ls -l|cut -с11-25 — диапазон номеров символов в строке и выводит на экран с 11 по 25 символ каждой строки листинга; $ls -l|cut -с25- |cat >>fil — вырезаются символы от 25 до конца строки, и выводит на экран только 25-й символ каждой строки. Значение числа элементов может быть вычислено, например: -c$a — значение задается переменной или -с`expr ………..` — может быть использовано арифметическое или логическое выражение (см. ниже) и т.п. Вопросы для самоконтроля 1. Понятие программного канала ОС UNIX. 2. Конвейеры. Какие команды могут быть включены в конвейер? 3. Какое практическое назначение конвейеров? 4. Команды-фильтры. Особенности работы. Примеры. 63
5. ПРОЦЕССЫ В UNIX 5.1. УПРАВЛЕНИЕ ПРОЦЕССАМИ UNIX — многопользовательская многозадачная операционная система. Концепция процесса является базовой для архитектуры ОС. Процесс строится для каждой прикладной (например, shпроцедуры) и системной задачи (например, утилиты) с помощью системного вызова fork. Является единицей вычислительной работы и потребления ресурсов. В процессе жизни в системе процесс непосредственно управляется специальными системными вызовами, которые обеспечивают его построение — передачу управления — завершение: fork - exec - exit — совокупность этих переключений состояний процесса определяет время существования процесса. В общем случае активный процесс (выполняемая задача) может находиться в одном из шести состояний (в Linux): • ожидание процессора в очереди; • выполнение на процессоре в течение выделенного кванта времени; • ожидание освобождения ресурса (например – устройства); • приостановлен специальным сигналом; • завершился, но его дескриптор еще в оперативной памяти ядра ОС; • процесс свопирован на внешнюю память. В ОП в активном состоянии находится несколько процессов — до 30000. Каждому процессу выделяется виртуальная память практически без ограничений (за счет страничной организации). При выполнении любого вычислительного задания прикладные и системные процессы ядра должны взаимодействовать между собой. Это необходимо для обмена данными, для передачи управляющей информации при использовании системных ресурсов, для синхронизации или управления последовательностью выполнения процессов и т.п.
64
Для этих целей служат специальные системные программы, встроенные в оболочку и поддерживающие следующие механизмы взаимодействия процессов: программы-сокеты — для обмена данными; программные каналы для обмена данными между утилитами (см. выше); асинхронные сигналы – ключевые слова, передаваемые от одного процесса к другому, например, для завершения выполнения процесса или для получения информации о свершении некоторых событий в системе (сигнал от таймера, ошибка при передаче данных на устройство, попытка выполнения несуществующей команды и пр.); семафоры – синхронизация выполнения процессов посредством установки значений бит-"флагов" специальных системных переменных; совместно используемая общая область физической памяти. Перечисленные механизмы использует как сама ОС (write,mail и пр.), так и прикладные программы с помощью команд управления процессами или системных вызовов. Роассмотрим создание и работу процессов на примере процедуры. Так как sh-процедура — исполняемый файл, то процесс его выполнения обеспечивается в ОС обычными механизмами построения и управления процессами. Для каждой sh-процедуры строится свой процесс со своим дескриптором — порожденный процесс. В дескрипторе процесса хранится информация, необходимая ядру для управления процессом. Дескриторы хранятся в адресном пространстве ядра ОС в виде двунаправленного приоритетного списка, упорядоченного в соответствии с их номерами – идентификаторами процессов (PID). Пример: $ vi proc date ls $sh proc < дата> f2 $ 65
Рассмотрим, как реализуются процессы процедуры примера. В ответ на приглашение -$ вводится имя процедуры proc и создается порожденный процесс shell. Он вводит данные, необходимые для своего выполнения из указанного файла proc — командные строки. Каждая команда sh-процедуры выполняется порожденным для неё процессом (как обычно для команды, введенной с клавиатуры — процессы утилит). Как только все команды окажутся выполненными, sh-процесс завершается и управление возвращается родительскому процессу. Процедура выполнена. Планировщик обрабатывает процессы двух видов – обычные и более приоритетные процессы реального времени. Место в очереди определяется его приоритетом. Процессы выполняются в одном из двух режимов — пользовательском и в режиме ядра. В режиме ядра выполняются процессы системных вызовов. В этом случае они имеют доступ к процедурам и структурам данных ядра. Такая организация позволяет ядру защитить свои процедуры и структуры системных данных от искажений со стороны проблемных задач. Дескрипторы процессов создаются и удаляются динамически при выполнении процессов. Поэтому состав и размер списка постоянно меняются. Так как все процессы связаны между собой родственными отношениями, то списковая организация процессов используется для процессов одного ранга (например, для всех порожденных одним родительским или для всех родительских и т.п.). Таким образом, вся система дескрипторов представляет собой некоторую древовидную структуру с коренным общисистемным процессом (swapper – имеющего идентификатор PID=0), который компилируется в состав ядра и используется для построения всей структуры дескрипторов и ее обработки. Открывается очередь наиболее приоритетным процессом инициатора ОС (init – PID=1), который строится первым при инициализпации ОС и уничтожается при завершении работы ОС (рис. 5.1).
66
0 swapper
1307 tty1 Все процессы раз sh
561
1 init
560 tty5 Родительский Процесс
562
978 tty n sh
563
Рис. 5.1. Схема очередей процессов, иллюстрирующая рализацию свойств многозадачной и многопользовательской ОС UNIX
Процесссор выделяется каждому процессу в очереди на ограниченные кванты времени в отличие от однозадачного режима (DOS), где процессор выделяется процессам последовательно на все время выполнения процесса. Это принципиально отличает многозадачный режим обработки заданий в UNIX. В UNIX пересчет приоритетов происходит постоянно по прерываниям определенного типа с частотой — около одного раза в секунду. Часть информации дескриптора может быть выведена в листинг характеристик процесса с помощью специальной команды ps (см. ниже). Некоторые заголовки полей листинга: номер терминала, которому принадлежит процесс (TTY); приоритет (PRI); использованное время процессора (TIME); идентификатор процесса (PID); имя программы процесса или команды, выполняемой в теле процедуры на момент запроса листинга (CMD); идентификатор родительского процесса (PPID); 67
-
адрес процесса (ADDR); величина изменения значения приоритета (NI) и пр.
Полную информацию о процессе пользователь или администратор может получить с помощью команды ps. По умолчанию эта команда выводит информацию о процессах пользователя данного терминала. $ps [-k] [<входное_имя_пользователя>] — вывод листинга характеристик процесса. Некоторые значения ключей: -a[l] — показать процессы данного терминала; -af — полный (достаточный) формат сообщения; -afl — длинный формат; -u — показать все активные процессы данного пользователя; -А — показать все активные процессы. Пример: PID PPID TTY PRI TIME $ps -flu lev 927 1 tty5 0:04 1001 927 tty5 0:02 …
CMD sh ps
Для вывода листинга процессов, принадлежащих пользователю можно воспользоваться конструкцией: $ps -f|grep <имя_пользователя>. Для управления состоянием процессов при оперативной работе можно использовать сочетание управляющих клавиш. При одновременном нажатии их в ВС вырабатывается прерывание определенного типа, которое и приводит к изменению сосотояний процессов (как прикладных, так и системных):— «зависает» активный процесс диалога с пользователем; — продолжить выполнение процесса; — конец набора текста с клавиатуры; — приостанов активного процесса; — выход из утилиты.
68
5.2. СОЗДАНИЕ ФОНОВЫХ ПРОЦЕССОВ При обычном запуске с терминала некоторой программы на исполнение (системной утилиты или прикладной задачи) интерпретатором shell создается привилегированный процесс, который все время связан со своим терминалом. Запуск следующего процесса может быть выполнен пользователем только после завершения текущего, т.е. при появлении приглашения '$' от интерпретатора. В целях использования возможности параллельного выполнения программ в ОС UNIX отдельные задачи или задания пакетного режима могут быть запущены одновременно с заданиями диалогового режима. Для запуска фонового (параллельного с другими потомками) процесса в командную строку необходимо и достаточно последним символом добавить знак & (амперсанд): $ cc prog.c & [1]2388 $ Shell выводит номер этого процесса (PID) и разрешает ввод следующей команды. Фоновые процессы обладают некоторыми недостатками: - не допускают ввода с клавиатуры; - обеспечивают вывод на экран, но при этом нарушают целостность вывода диалогового процесса. Общепринятый прием исключения влияния фонового вывода на интерактивную работу: $<командная_строка> > имя_файла.out & - <командная_строка> планирует задание для фонового режима; - перенаправляет вывод вместо экрана в указанный файл головного каталога пользователя. Пример: $grep ааа* > grep.out & [2]194 $ps PID 194 200
TTY tty5 tty5
TIME 0:02 0:01 69
CMD grep ps
Особенности работы с фоновым режимом: выполняемая в фоновом режиме программа (команда), требующая стандартного ввода, должна читать его из файла с использованием перенаправленного ввода; программа, выполняемая в фоновом режиме, не может быть прервана, так как она отсоединяется от клавиатуры и может быть прекращена только с помощью команды kill или выходом из системы; выход из системы exit надо выполнять два раза: для завершения фонового процесса и завершения основного процесса shell. В случаях, когда фоновый процесс все же требует ввода данных с клавиатуры, то его надо временно перевести в оперативный режим, ввести данные, и вернуть опять в фоновый с помощью следующих команд: fg %N — перевод фонового процесса в оперативный; bg %N — перевод оперативного в фоновый режим. Здесь N — порядковый номер фонового задания, которое в общем случае может содержать несколько активных процессов и все они переводятся в соответствующий режим. Номер задания “N” выводится: при запуске фоновой программы; командой jobs без приостановленя или с приостановлением фонового процесса. Приостановить выполнение процесса с выходом в shell (например, для анализа состояния и результатов работы процедуры) можно с помощью прерывания $ с последующим запуском приостановленного процесса. Пример: $inf>f.out& # запуск процедуры inf в фоновом режиме; [1] 1754 # номер задания и идентификатор процесса; $jobs %1 70
# номер задания фоновой задачи; $fg %1 # перевод из фонового в оперативный;# приостанов оперативного процесса; [1]+stopped inf>f.out $fg %1 # продолжение оперативного (бывшего фонового); $bg %1 # возврат процесса в фоновый режим; [1] inf>f.out. Выполнение фоновых заданий прекращается с выходом пользователя из системы. НО! Если фоновая программа должна быть продолжена и после прекращения текущего сеанса работы, то необходимо использовать команду: $nohup имя_фоновой_программы & — команда, во-первых, запускает и защищает фоновую программу от прерываний, вырабатываемых при выходе пользователя из системы, и, вовторых, перенаправляет фоновый протокол в системный файл nohup.out. Вместе с тем, вывод протокола работы фоновой программы можно перенаправить в специальный файл, который можно просмотреть позже без нарушения протокола работы с оперативной задачей: $nohup имя_фон_программы>имя_файла& Рассмотрим два примера применения команды nohup. Пример 1. nohup перенаправляет протокол в указанный файл: $nohup cat * > outfile & [1] 972 $exit # завершается работа оперативного процесса. Повторный вход в систему: login: password: $ps -af|grep cat # конвейер, выделяется строка с шаблоном cat 71
UID lev $
PID 972
PPID 1
CMD cat *>outfile &
В примере “фоновый вычислительный процесс идет”, nohup становится самостоятельным процессом, и его PPID меняется — родительским процессом был shell (см. примеры выше), а стал init c PID=1, т.е. приоритет фонового процесса “усиливается” общесистемным процессом init и его выполнение будет продолжаться. Примечание. В поле CMD может не указываться имя процедуры, а выводиться имя текущей утилиты этой процедуры, идентифицировать процедуру лучше по PID. Если перенаправление протокола не использовать, то вывод автоматически осуществляется в систеный файл nohup.out, создаваемый системой в головном каталоге пользователя HOME. Пример 2: $nohup find / -user lev -type f & [1] 2301 <сообщение о выводе в nohup.out> $cd — переход в HOME $cat nohup.out <протокол команды find> $ Команда nohup позволяет таким образом предупредить вывод на экран протокола фонового задания с прерыванием протокола работы оперативного процесса. Пример: в чем разница в выполнении командных строк? $PR;pr2;pr3 & — в фоновом режиме выполняется только pr3; $(PR1;pr2;pr3) & — в фоновом режиме выполняются все программы (подстановка опции & перед выполнением каждой программы из списка).
72
5.3. УПРАВЛЕНИЕ ПРИОРИТЕТАМИ ПРОЦЕССОВ Максимальный приоритет процессов каждого пользователя группы устанавливает администратор. Если при выполнении задания образуются несколько порожденных процессов, то все они имеют одинаковый приоритет равный родительскому. В этом случае все процессы получают ресурсы равными долями (простой режим разделения времени). При необходимости выделения наиболее важных родительских процессов порожденным второстепенным можно понизить приоритет с помощью команды: nice [-k] имя_программы — выполнение программы, указанной в строке, с пониженным приоритетом. -k — коэффициент понижения приоритета (k = 1;...10; по умолчанию k = 10). Пример 1: $ prog1 & $ ps -al ........ PID ...... PRI NI......CMD.. ................... 20 sh .................. . 20 prog1........ т.е. родительский и порожденный процессы имеют приоритет, равный 20. Пример 2: $ nice -5 prog2 & [2] 3752 $ps -flu lev ........ PID ...... PRI .....NI.. .................. . 20 ........ ........ 3752 ..... 25 .......5 ................... 20 ..
CMD sh prog2. ......
Приоритет процесса задачи prog2 понижен на 5 единиц, тем самым другие процессы этой группы имеют больше возможностей в использовании ресурсов. Чем больше число, тем ниже приоритет.
73
5.4. ЗАВЕРШЕНИЕ ПРОЦЕССОВ Завершение процессов – одна из функций управления процессами. Прекратить выполнение любого процесса можно с помощью команды: kill [-опции] PID1 [PID2......] — передает сигнал процессу PID. Сигнал — ключевое слово, при получении которого процесс выполняет некоторые действия. Сигналы с использованием команды kill могут передаваться другими прикладными процессами или системными программами (например, при появлении некоторых событий, как то сбой в канале, сигнала с таймера, завершения фонового процесса и пр.). Существуют двадцать пять видов сигналов, предназначенных для выполнения различных действий процессами при наступлении определенных событий в системе. С получением большинства сигналов процесс завершается самостоятельно. Тот, кто посылает сигнал, должен быть владельцем процесса или администратором. Для безусловного и немедленного завершения указанного процесса kill должен послать сигнал с именем TERM (по умолчанию). Другие сигналы передаются с помощью опции -S. Значения опций: -S<имя_сигнала> или -№ — системный номер сигнала; -l — вывод на экран справочника имен сигналов. Сигнал определяет дальнейшее действие процесса. Это еще один способ управления процессами (см. выше). Примеры опций: -S KILL — немедленное завершение процесса по сигналу KILL; -9 — то же, но уже по номеру сигнала KILL. Пример: $kill [-9] 3752 3752: killed $ Пример завершения фонового процесса: $kill %1 — указывается номер завершаемого задания [1] +Terminated inf $ 74
Если процесс указан идентификатором "0", то команда kill уничтожает все процессы, связанные с текущим shell (завершается головной процесс swapper (имеющий PID=0) и все связванные с ним порожденные процессы – shell, прикладные задачи). 5.5. ПЕРЕХВАТЫВАНИЕ СИГНАЛОВ В процедурах управления процессами особое место занимает команда: trap ' список команд или имя sh-процедуры' сигнал1 сигнал2 Команда перехватывает указанные сигналы и последовательно выполняет все команды списка, прежде чем поступивший сигнал будет передан процессу. Например, команда может быть использована для синхронизации заданий, если надо выполнить какие-то действия с файлами, а затем уже завершить процесс. Пример. Циклическая процедура выполняется до поступления одного из указанных сигналов: $cat > trapfil trap 'echo нажать Ctrl*C' INT QUIT TERM while true do echo цикл done$sh trapfil цикл цикл ……. нажать Ctrl*C — поступил один из указанных трех сигналов $ # циклическая процедура будет завершена при поступлении хотя бы одного из # указанных сигналов. Применение команды trap может быть самым разнообразным. Но глубокое её изучение требует предварительного знания всего списка сигналов и их назначения, а также наиболее часто встречающихся типовых применений trap. Эта задача выходит за рамки настоящего курса. 75
Вопросы для самоконтроля 1. Понятия ресурсов и процессов в ОС UNIX. Принципы формирования и представления процессов. Общая схема организации управления процессами. 2. Принципы упорядочивания и управления процессами в ОС UNIX. Дескрипторы процессов. 3. Назначение и содержание дескриптора процесса. Приоритетные очереди процессов в ОС UNIX. 4. Средства командного языка для получения информации о процессах. Какие сведения о состоянии и очереди процессов данного терминала могут быть получены из листинга? 5. Принципы организации многозадачного режима выполнения заданий с терминала пользователя. Организация и управление фоновыми процессами. Примеры. 6. Механизм защиты фоновых процессов от внешних прерываний. Отображение механизма в листинге процессов. Пример. 7. Механизм и команда ОС UNIX по управлению приоритетами процессов в ОС UNIX. Пример применения команды и пример листинга. 8. Обзор команд по управлению процессами и их назначение. Примеры. 9. Обзор средств взаимодействия процессов и механизмов их работы. 10. Программные средства взаимодействия процессов. Передача сигналов. Пример применения команды. 11. Программные средства взаимодействия процессов. Команда перехватывания сигналов, ее назначение.
76
6. ПРАКТИКУМ ДЛЯ САМОСТОЯТЕЛЬНОГО ОСВОЕНИЯ КОМАНД Закрепление сведений о возможностях командного языка ОС UNIX и приобретение навыков их практического применения возможно только на компьютере при выполнении конкретных практических заданий. В данном случае процесс практического закрепления предлагается выполнять в виде лабораторного практикума, включающего пять лабораторных работ, объединяющих близкие по назначению команды. Практикум может быть выполнен в среде любой доступной операционной системы (System Y, AIX, Linux и др.), в основном на индивидуальном компьютере или для отдельныъх коммуникационных команд — в многотерминальном режиме. В качестве базового принят Korn-shell. Команды этой оболочки входят в стандарт POSIX, т.е. являются принадлежностью любой UNIX-подобной операционной системы. Для анализа проделанной лабораторной работы в целом можно использовать команду history — вывод на экран выполненных команд. Работа 1. ЗНАКОМСТВО С ОС UNIX Изучаются команды: date — определение текущей даты и времени; env — вывод значений переменных среды; who, id — идентификация пользователей; write, mesg — команды обмена прямыми сообщениями; mail — отправление и чтение почтовых сообщений; more — постраничный вывод содержимого файла на экран. МЕТОДИКА ВЫПОЛНЕНИЯ 1. Войдите в систему с зарегистрированным администратором логическим именем и паролем. Проанализируйте сообщение системы. Чем заканчивается сообщение системы? 2. Проанализируйте содержание системного файла /etc/passwd. Найдите запись, относящуюся к Вам. 3. Детально проанализируйте и объясните каждое поле записи, его назначение. 77
4. Выведите на экран значения переменных среды. Проанализируйте назначение переменных. 5. Какая переменная определяет текст приглашения? Измените текст приглашения. Восстановите стандартное значение приглашения. 6. Выведите текущие дату и время. Проанализируйте текст сообщения. 7. Определите пользователей системы, работающих с системой параллельно с Вами, их логические имена и номера терминалов. 8. Договоритесь с соседним пользователем об организации обмена прямыми сообщениями. Обменяйтесь с ним сообщениями в режиме прямого диалога. 9. Исследуйте возможности средств блокирования и разблокирования приема сообщений. 10. По договоренности с коллегами обменяйтесь несколькими почтовыми сообщениями. 11. Проанализируйте возможности обработки поступивших почтовых сообщений. 12. Определите числовые идентификаторы Вас как пользователя и Вашей группы. 13. Проанализируйте с использованием команды history содержание лабораторной работы, продумайте ответы на нижеприведенные контрольные вопросы. Контрольные вопросы 1. Объясните назначение информации, запрашиваемой системой в начале работы. 2. В чем заключается процедура авторизации пользователя? Цель авторизации? 3. Объясните содержание и назначение каждого поля регистрационной записи. 4. Какая операционная система Вас обслуживает и какой shell? 5. Что такое среда пользователя? Как она формируется? 6. В чем отличие в диалоге прямыми сообщениями и почтовыми? 7. Определите возможности электронной почты. Какие режимы работы электронной почты Вы знаете? 8. Какое назначение числовых идентификаторов пользователей и групп в работе UNIX? 78
Работа 2. УПРАВЛЕНИЕ КАТАЛОГАМИ Посвящена изучению структуры файловой системы и возможностей командного языка UNIX по управлению каталогами. Изучаются команды: mkdir, rmdir — для создания и уничтожения каталогов; ls — вывод листинга каталога; pwd — вывод на экран полного имени текущего каталога; cd — смена текущего каталога; find, grep — поиск файлов в системе каталогов; >маршрутное-имя-файла — создание пустого файла. МЕТОДИКА ВЫПОЛНЕНИЯ 1. Определите уникальное имя Вашего головного личного каталога. Объясните структуру полного маршрутного имени каталога. 2. Создайте два поддерева из одного и двух каталогов. 3. С использованием команды ls проверьте факт построения дерева подкаталогов. 4. Просмотрите содержимое пустых подкаталогов, т.е. новых подкаталогов, не содержащих файлов. Объясните их содержание. 5. Сделайте текущим последний каталог меньшего поддерева. 6. Определите его полное маршрутное имя. 7. Смените текущий каталог на подкаталог большего поддерева. 8. Определите его полное маршрутное имя. 9. Поместите в созданные подкаталоги по 2-3 пустых файла не выходя из текущего. Используйте при этом разные способы задания маршрутного имени подкаталогов. 10. Просмотрите содержимое каталогов. Объясните содержание каждого поля каталогов. 11. Установите в качестве текущего HOME-каталог. 12. Найдите обычные файлы с определением их полных маршрутных имен. Выполните то же для различных комбинаций известных Вам условий поиска файлов. 13. Проделайте предыдущее задание для файлов типа каталог. 14. Выведите на экран принадлежащую Вам регистрационную запись с использованием команды grep. 15. Уничтожьте все построенные Вами подкаталоги. Получите подтверждение выполнения команд по содержимому домашнего каталога. 16. Проанализируйте с использованием команды history содержание лабораторной работы, продумайте ответы на нижеприведенные контрольные вопросы. 79
Контрольные вопросы 1. Какие системные имена каталогов Вам известны? 2. Каким образом можно построить отдельный каталог или цепочку каталогов? 3. Для чего и каким образом переопределяются текущие каталоги? 4. Как обратиться к файлам параллельных ветвей дерева каталогов? К вышележащему каталогу? 5. Какие условия поиска файлов Вы знаете? Как комбинируются условия поиска? Как осуществить поиск по дереву каталогов? 6. Какова последовательность действий при удалении одного каталога? Цепочки каталогов? 7. Объясните назначение и содержание каждого поля каталога. 8. Как отличить по содержимому каталога типы файлов, содержащихся в Ваших каталогах? 9. Какую информацию содержит «пустой» вновь созданный каталог? 10. Как осуществить поиск файлов в системе каталогов по фрагментам текста файлов? Работа 3. УПРАВЛЕНИЕ ФАЙЛАМИ Посвящена изучению приемов формирования и преобразования файлов в ОС UNIX. Изучаются команды: cat, cp — копирование файлов; mv — перемещение и переименование файлов; ln — организация ссылок на файл; sort — сортировка файлов; wc — определение числовых параметров файла; touch — обновление временных характеристик файла. МЕТОДИКА ВЫПОЛНЕНИЯ 1. Выведите на экран содержимое Вашего HOME-каталога. 2. Создайте 3-4 текстовых файла с частично совпадающими именами. Проанализируйте значения атрибутов Ваших файлов. 3. Создайте еще один файл методом слияния из существующих. Как изменились атрибуты нового файла? 80
4. Создайте два новых параллельных подкаталога. 5. В один подкаталог скопируйте имеющиеся файлы HOMEкаталога с изменением имен, а в другой – переместите. Проанализируйте, как изменилось содержание всех трех каталогов и каковы атрибуты всех полученных файлов. 6. Просмотрите содержимое файлов с частично совпадающими именами с использованием механизма генерации имен файлов. 7. С использованием механизма генерации имен файлов слейте содержимое всех файлов в один и поместите его в HOME-каталог. Проанализируйте содержание файла. 8. Создайте ссылку с другим именем в одном из подкаталогов на один из файлов другого подкаталога. Проанализируйте и сравните все атрибуты связанных файлов. Объясните отличия. 9. Создайте еще одну ссылку с другим именем. Проанализируйте и сравните все атрибуты связанных файлов. Объясните отличия. 10. Создайте ссылки на несколько файлов, принадлежащих одному из каталогов, в другом каталоге одной командной строкой. Проанализируйте и сравните все атрибуты связанных файлов. Объясните отличия. 11. Измените содержимое одного из связанных файлов. Проанализируйте содержимое других связанных с ним файлов (или файла). Объясните результат. 12. Уничтожьте один из связанных файлов. Проанализируйте и сравните все атрибуты связанных с ним файлов. Объясните изменения. 13. Упорядочите по алфавиту строки суммарного файла HOME-каталога. 14. Обновите временные характеристики одного из существующих файлов. Проанализируйте результат. 15. Обновите временные характеристики несуществующего файла. Проанализируйте результат работы команды. 16. Проанализируйте с использованием команды history содержание лабораторной работы, продумайте ответы на нижеприведенные контрольные вопросы.
81
Контрольные вопросы 1. Назовите известные Вам способы создания пустых файлов. Как создать текстовый файл? 2. Какие возможности сокращения записи имен файлов Вы знаете с использованием механизма генерации имен файлов? 3. Какие три команды этой лабораторной работы можно использовать для переименования файлов? Как в этом случае надо использовать команды? 4. Какими способами можно объединить несколько текстовых файлов в один? 5. В чем разница работы команд cp и mv? 6. Сколько ссылок можно создать на единственный файл из разных каталогов? 7. Как создать несколько ссылок с совпадающими именами на несколько файлов в другом каталоге? 8. Какое соответствие атрибутов имеют связанные между собой файлы? 9. На какой атрибут и как влияет удаление одного из связанных файлов? 10. Как отражается на содержимом связанных файлов изменение содержания одного из них и почему? 11. Какими возможностями обладает команда sort? Работа 4. УПРАВЛЕНИЕ ПРАВАМИ ДОСТУПА К ФАЙЛАМ И КАТАЛОГАМ Посвящена изучению принципов защиты файлов и каталогов ОС UNIX от несанкционированного доступа. В UNIX эти средства являются встроенными и наиболее развиты по сравнению с другими операционными системами. Изучаются вопросы влияния задаваемых прав доступа к файлу на выполнение различных команд по обработке этих файлов. Для управления правами доступа к файлам и каталогам используется команда: chmod — изменить права доступа к указанному файлу.
82
МЕТОДИКА ВЫПОЛНЕНИЯ 1. Создайте в Вашем HOME-каталоге один текстовый файл, например с именем f1. Выведите на экран полный листинг каталога. 2. Проанализируйте и умейте объяснить, какие права доступа к f1 имеет владелец файла, его группа и остальные пользователи. 3. Проанализируйте права доступа к Вашему головному каталогу. Есть ли ограничения на работу с файлами в этом каталоге? 4. Выведите на экран содержимое файла f1. Объясните, почему операция выполнилась успешно. 5. Запретите права на чтение f1 владельцу и группе. Попытайтесь вывести на экран текст файла. Объясните, почему операция не выполняется. 6. Удалите права на запись в файл. Попытайтесь добавить к файлу текст и удалить его. Объясните результат. 7. Удалите право на модификацию каталога. Повторите операцию удаления. Объясните результат. 8. Создайте подкаталог. Разместите в нем текстовый файл. Проанализируйте права доступа к подкаталогу и объясните возможности по использованию подкаталога. 9. Удалите право владельца на «выполнение» подкаталога. 10. Попытайтесь сделать подкаталог текущим. Объясните результат. 11. Просмотрите содержимое подкаталога. Объясните результат. 12. Попытайтесь вывести длинный листинг подкаталога только для одного из файлов (поиск файла по подкаталогу). Объясните результат. 13. Попытайтесь вывести на экран содержимое файла. Объясните результат. 14. Верните право для подкаталога на «выполнение», удалите право на «чтение» и сохраните право на «модификацию». 15. Выполните пп. 10, 11, 12, 13. Проанализируйте и объясните результаты. 16. Проанализируйте с использованием команды history содержание лабораторной работы, продумайте ответы на нижеприведенные контрольные вопросы.
83
Контрольные вопросы 1. Как кодируются в атрибутах файла и каталога права доступа? 2. Кто может пользоваться и изменять права доступа к файлам? 3. Какие команды для изменения символьных кодов прав доступа Вы знаете? Перечислите и расскажите о назначении каждой из команд. 4. В чем разница в применении команд chmod и umask? 5. Какие команды обработки файлов разрешают (или запрещают) права на чтение, модификацию и исполнение? 6. Какие команды обработки каталогов разрешают (или запрещают) эти же права? 7. Что означает право на выполнение применительно к каталогу? 8. Какими правами надо обладать, чтобы удалить файл или каталог? 9. Какие команды для защиты файлов Вы знаете? Работа 5. УПРАВЛЕНИЕ ПРОЦЕССАМИ Цель работы — закрепить представление о возможностях командного языка UNIX по управлению процессами, которым выделяются все необходимые ресурсы вычислительной системы. Изучаются команды: ps — запрос информации о процессах текущего терминала; & — запуск фонового процесса; fg, bg — переводит процесс в активный или фоновый режим; jobs — запрос листинга списка заданий; nohup — защита фоновых процессов от прерывания выполнения при выходе из сеанса работы с системой; nice — понижение приоритета процесса; kill — прекращение выполнения процесса. МЕТОДИКА ВЫПОЛНЕНИЯ 1. Вывести на экран листинг характеристик (в длинном и коротком форматах) процессов, инициализированных с Вашего терминала. Проанализировать и объяснить содержание каждого поля сообщения. 2. Разработать и запустить простейшую процедуру в фоновом режиме с бесконечным циклом выполнения, предусматривающую, 84
например, перенаправление вывода каких-то сообщений в файл или в фиктивный файл, и использующую команду sleep для сокращения частоты циклов процедуры. 3. Выполнить п. 1. Объяснить изменения в листинге харатеристик процессов. Объясните содержание PID и PPID. 4. Понизьте значение приоритета процедуры. На что и как повлияет эта операция при управлением вычислительным процессом системы? Как отразятся её результаты в описателях процессов? 5. Проанализируйте листинг процессов. Какой процесс является родительским для процедуры? 6. Выйдите из системы и войдите заново. Проанализируйте листинг процессов. Объясните изменения в системе. 7. Запустите процедуру в фоновом режиме, но предусмотрите её защиту от прерывания при выходе из системы. 8. Выполните п. 6. Объясните изменения PPID-процедуры. 9. Завершите выполнение процесса процедуры. 10. Запустите процедуру в оперативном режиме с перенаправлением вывода в соответствующий файл. 11. Переведите задание с процедурой в фоновый режим и проанализируйте сообщение на экране. 12. Переведите задание с процедурой в оперативный режим и проанализируйте сообщение на экране. 13. Завершите выполнение процедуры и проанализируйте сообщение на экране. 14. Проанализируйте с использованием команды history содержание лабораторной работы, продумайте ответы на нижеприведенные контрольные вопросы. Контрольные вопросы 1. Объясните понятия процесса и ресурса. Какое их значение в организации вычислительного процесса в ОС UNIX? 2. Какая информация содержится в описателях процессов? Как просмотреть их содержание в процессе работы с системой? 3. Какими способами можно организовать выполнение программ в фоновом режиме? 4. Какие особенности выполнения программ в фоновом режиме? Как избежать вывода фоновых сообщений на экран и прерыва85
ния выполнения фоновых программ при прекращении сеанса работы с системой? 5. Как пользователь может повлиять на распределение ресурсов между активными процессами? 6. Как можно прервать выполнение активных процессов? Какая информация для этого необходима и откуда она извлекается?
7. ВВЕДЕНИЕ В SHELL- ПРОГРАММИРОВАНИЕ. ПЕРЕМЕННЫЕ SHELL 7.1. ПОНЯТИЕ ПРОЦЕДУР Язык shell по своим возможностям приближается к высокоуровневым алгоритмическим языкам программирования. Операторы языка shell позволяют создавать собственные программы. В программах могут использоваться любые команды командного языка, в том числе и рассмотренные в данном пособии. Такие программы, а также командные файлы, содержащие их, называют shell-процедурами или shell-файлами. От обычных программ они отличаются способом их обработки. Процедура не требует компиляции, построения объектного файла и последующей компоновки, так как shell, обрабатывающий их, является транслятором интерпретирующего, а не компилирующего типа. Процедура — аналог командного файла в MS-DOS, но с более широкими возможностями. Здесь же отметим, что рассмотренные ниже операторы могут быть использованы как в теле процедуры, так и выполнены независимо как обычные команды операционной системы в диалоговом режиме. Текст процедуры набирается как обычный текстовый файл. Для этих целей при создании большой процедуры целесообразно использовать редактор vi. Для создания простейших процедур можно использовать команду cat или один из следующих способов создания пустых файлов с последующим заполнением командами ОС или операторами языка shell.
86
Проверенный и отлаженный shell-файл может быть вызван на исполнение, например, следующим способом: $ chmod u=rx shfil $ shfil $ Для выполнения процедуры необходимы права r,x; обычно право r задается администратором, так как файлы должны быть читаемы, тогда опция может иметь вид u+x. Такая форма запуска процедуры предполагает, что файл процедуры новый и его надо сначала сделать выполняемым. Можно использовать также и следующий способ: $ sh -c "shfil" или $ sh shfil # Здесь файл shfil предполагается читаемым для shell, т.е. иметь право r. В этих случаях по команде sh вызывается вторичный интерпретатор shell, и в качестве аргумента ему передается командная строка, содержащая имя файла процедуры shfil, находящегося в текущем каталоге. Однако этот способ накладывает ограничения на исполнение некоторых команд ОС управления процессами (например, nice – см. ниже). Процедуре при ее запуске могут быть переданы аргументы. В общем случае командная строка вызова процедуры имеет следующий вид: $ имя_процедуры $1 $2 ...$9 $ Каждому из девяти первых аргументов командной строки в тексте процедуры соответствует один из позиционных параметров, имеющий соответствующий номер занимаемой им позиции в коде команды $1, $2, ..., $9. Параметр $0 соответствует имени самой процедуры, т.е. первому полю командной строки. К каждому из 10 первых аргументов можно обратиться из процедуры, указав номер его позиции.
87
Некоторые вспомогательные операторы: echo — вывод сообщений из текста процедуры на экран. $ echo “начало строки > продолжение строки” или $ echo “строка текста” $ # — для обозначения строки комментария в процедуре. (Строка не будет обрабатываться shell.) banner —- вывод сообщения на экран заглавными буквами (например для идентификации следующих за ним сообщений). $banner 'hello ira' HELLO IRA $ Простейший пример. Здесь оператор echo выполняется также в командном режиме. На экран выводится третий параметр, передаваемый процедуре при ее запуске: $shfil p1 pp2 petr $echo $3 petr $ Значения параметрам, передаваемым процедуре, можно присваивать и в процессе работы процедуры с помощью оператора set — присвоить значения позиционным параметрам. Пример: $set a1 ab2 abc $echo $1 $2 a1 ab2 $ В этом примере параметры указываются в явном виде. Количество позиционных параметров может быть увеличено до необходимого значения путем “сдвига” их в командной строке влево на одну позицию с помощью команды shift без аргументов: shift — сдвинуть позиционные параметры влево на одну позицию. 88
После выполнения shift прежнее значение параметра $1 теряется, значение $1 приобретает значение $2, значение $2 — значение $3 и т.д. Продолжение предыдущего примера: $shift $echo $1 $2 ab2 abc $ В UNIX при написании командных строк и в shell-процедурах особое значение имеет правильное использование кавычек (апострофов): '...' — для блокирования полного набора специальных символов, которые могут быть интерпретированы как управляющие; "..." — для блокирования некоторых символов, которые могут использоваться в именах переменных или для указания того, что обрабатывается не сам аргумент, а его значение (подстановка значения), в частности не блокируют $, `…`,\ ; `...` — (обратные кавычки или знак ударения) для указания того, что они обрамляют команду, и здесь будет обрабатываться результат работы этой команды (подстановка результатов работы указанной команды). Пример 1: $ date Apr 3 14:27:07 2007 $ set `date` $ echo $3 14:30:25 $ Пример 2: $echo `ls` fil.1 fil.2 ... $echo '`ls`' `ls` $ 89
Здесь одинарные кавычки блокируют действие обратных кавычек, т.е. они распечатываются как обычные символы. Пример 3. $ls -al|grep “Mar 30” #выводится информация о всех файлах текущего каталога, модифицированных # 30 марта всех годов. Эта же командная строка без кавычек приобретает совершенно другой смысл: $ls -al|grep Mar 30 #здесь Mar –шаблон, а 30 – имя файла. Для ввода строки текста со стандартного устройства ввода используется оператор: read имя1 [имя2 имя3 .] — чтение строки слов со стандартного устройства ввода. Команда вводит строку, состоящую из нескольких полей (слов), со стандартного ввода, заводит переменную для каждого поля и присваивает первой переменной имя1, второй переменной — имя2, и т.д. Если имен больше, чем полей в строке, то оставшиеся переменные будут инициализированы пустым значением. Если полей больше, чем имен переменных, то последней переменной будет присвоена подстрока введенной строки, содержащая все оставшиеся поля, включая разделители между ними. В частности, если имя указано только одно, то соответствующей ему переменной присваивается значение всей строки целиком. Образованные таким образом переменные далее могут обрабатываться процедурой или отдельными командами ОС. Пример (предполагает наличие программы-русификатора): #Текст процедуры: echo "Введите значения текущих: гг мм чч вв" read 1v 2v 3v echo "год 1v" echo "месяц 2v" echo "сегодня 3v" # здесь кавычки используются для блокирования пробелов #Результат выполнения процедуры: Введите значения текущих: гг мм ччвв 2009 Maрт 21 9:30 <Enter> год 2009 месяц Maрт сегодня 21 9:30 90
7.2. УПРАВЛЕНИЕ ЛОКАЛЬНЫМИ ПЕРЕМЕННЫМИ В отличие от рассмотренных в начале курса системных переменных среды, переменные языка shell называются локальными переменными и используются в теле процедур для решения обычных задач. Локальные переменные связаны только с породившим их процессом. Локальные переменные могут иметь имя, состоящее из одного или нескольких символов. Присваивание значений переменным осуществляется с помощью известного оператора "=" - присвоить (установить) значение переменной. При этом, если переменная существовала, то новое значение замещает старое. Если переменная не существовала, то она строится автоматически shell. Переменные хранятся в ОП — области локальных данных. Необходимо различать собственное имя переменной и значение переменной. Так если variable — имя некоторой переменной, то $variable – ссылка на ее значение. Собственные имена переменных могут использоваться только при объявлении переменной, при присваивании ей некоторого значения, при удалении, при экспортировании (см. ниже) и если переменная — сигнал для управления процессами (см. ниже). Примеры присваивания значений. $count=3 $color=”red belt” $fildir=lev/d1/d12 $ Еще пример: # текст и результат выполнения процедуры b=”1 + 2” echo ”C=$b” …………. c=1+2 # в результате выполнения процедуры выводится текст, # включающий текст (значение) переменной b; двойные кавычки #блокируют операцию присваивания и не блокируют $ echo `c=$b` …………. 1+2 # здесь обратные кавычки определяют вывод результата операции # присваивания $ 91
На экране можно просмотреть все заведенные локальные переменные с помощью известной команды set без параметров: $ set $ Удаление переменных: $unset перем1 [перем2 ........] $ 7.3. ПОДСТАНОВКА ЗНАЧЕНИЙ ПЕРЕМЕННЫХ Процедура подстановки выполняется shell каждый раз, когда надо обработать значение переменной, если используется следующая конструкция: Первый вид подстановки $имя_переменной — на место этой конструкции будет подставлено значение переменной. Соответствующая команда процедуры будет выполнена только после того, как shell выполнит подстановку всех переменных в командной строке. Аналогичный результат может быть получен и следующим образом: “имя_переменной” Значения переменных могут представлять собой: • абсолютные числовые или символьные значения, • команды, • аргументы команд или целиком командные строки. В частности, эту процедуру удобно использовать, например, для переименования часто используемых длинных маршрутных имен или командных строк. Примеры подстановки длинных маршрутных имен: $echo $HOME /home/user1/lev $filname=$HOME/f1 $more $filname <текст файла f1 из каталога lev> $ 92
Использование полного маршрутного имени в качестве значения переменной позволяет пользователю независимо от местонахождения в файловой системе получать доступ к требуемому файлу или каталогу. Если в строке несколько присваиваний, то последовательность их выполнения в bash – слева направо. Пример 1: $ y=123;z=$y $ echo $z $y 123 123 $ y=abc z=$y $ echo “$z” abc $ echo “$y” abc $ # двойные кавычки не блокируют $ Пример 2: $ var=/user/lab/ivanov $ cd $var $ pwd /udd/lab/ivanov $ # задано и установлено имя текущего каталога Пример 3: $ namdir='ls' $ $namdir fil1 fil2 fil3 ... $ # переменной namdir присвоено значение, которое затем используется в качестве командной строки запускаемой команды. Это команда ls. 93
Второй вид подстановки — подстановка результатов работы команды вместо самой команды. Пример 4: $ filnam=`ls` $ echo $filnam fil1 fil2 fil3 ... $ # команда ls непосредственно выполняется уже в первой строке и переменной filnam присваивается результат ее работы. Пример 5: $ A=1;B=2 $ summa="$A + $B" $ echo $summa 1+2 $ С переменными можно выполнять арифметические действия, как и с обычными числами c использованием специального оператора: expr — вычисление выражений. Для арифметических операций, выполняемых командой expr, используются операторы: + сложение; - вычитание; \* умножение (обратная прямая скобка \ используется для отмены действия управляющих символов, здесь *); / деление нацело; % остаток от деления. Для логических операций арифметического сравнения чисел командой expr используются следующие обозначения: = равно; != не равно; \< меньше; \<= меньше или равно; \> больше; \>= больше или равно. 94
Символы * < > необходимо экранировать, как показано, чтобы отменить их специальный смысл — шаблон имен файлов (для *) и перенаправление потоков ввода и вывода (для < и >). Результатом операции арифметического сравнения чисел командой expr является выработка ею кода – значения результата логического сравнения двух чисел: 0 (ложь) или 1 (истина). Примечание. Это не код возврата как результат успешности выполнения команды (см. ниже).
Все операнды и операторы являются самостоятельными аргументами команды expr и поэтому должны отделяться друг от друга и от имени команды expr пробелами. Пример 6: # Текст процедуры: a=2 a=`expr $a + 7` b=`expr $a / 3` c=`expr $a - 1 + $b` d=`expr $c % 5` e=`expr $d - $b` echo $a $b $c $d $e #Результат работы процедуры: 9 3 11 1 -2 Команда expr выводит результат вычисления на экран. Поэтому, если он не присвоен никакой переменной, то не может быть использован в программе. При решении логических задач, связанных с обработкой символьных строк (текстов), команда expr может быть использована, например, как средство для подсчета символов в строках или для вычленения из строки цепочки символов. Операция обработки строк символов задается кодом операции ":" и шаблонами. В частности: '.*' — шаблон для подсчета числа символов в строке, '...\(.*\)....' — шаблон для выделения подстроки удалением символов строки, соответствующих точкам в шаблоне.
95
Пример 7: $ m=aaaaaa $ expr $m : '.*' 6 $ Пример 8: $ n=abcdefgh $ expr $n : '...\(.*\)..' def $ Выводимая информация — количество символов или подстрока — может быть присвоена некоторой переменной и использована в дальнейших вычислениях. Третий вид подстановки применяется для подстановки команд или целых shell-процедур. Используется для замены кода команды или текста процедуры на результат их выполнения в той же командной строке: $(командная_строка) — подстановка осуществляется также перед запуском на исполнение командной строки. Эта форма подстановки является альтернативой рассмотренной выше конструкциии, использующей заключение команды между знаками тупого ударения: `командная_строка`, когда также выполняется процедура подстановки. В данном случае в качестве подставляемой команды может быть использована также любая имеющая смысл sh-процедура. Shell просматривает командную строку и выполняет все команды между открывающей и закрывающей скобками. Рассмотрим примеры присвоения значений и подстановки значений локальных переменных. Пример 9: $ A='string n' $ count=$(expr $A : '.*') $ echo $count 8 $ 96
#Продолжение примера: $ B=$(expr $A : '..\(.*\)) $ echo $B ring $ Рассмотрим пример на разработку простейшей линейной процедуры обработки переменных средствами языка shell. ЗАДАНИЕ. Создать файл, содержащий процедуру сложения двух чисел. Числа передаются в виде параметров при обращении к процедуре. Выполнить процедуру: $ cat>comf SUM=$(expr $1 + $2) echo "$1 + $2 = $SUM"$ sh comf 3 5 3+5=8 $ #двойные кавычки не блокируют действие символа $. 7.4. ЭКСПОРТИРОВАНИЕ ЛОКАЛЬНЫХ ПЕРЕМЕННЫХ При выполнении процедуры ей можно передавать как позиционные параметры (см. выше), так и ключевые — локальные переменные порожденного процесса. Локальные переменные помещаются в область локальных переменных, связанную с конкретным текущим процессом, породившим переменную. Они доступны только этому процессу и недоступны порожденным процессампотомкам (например, sh-процедурам). Переменные другим процессам можно передавать неявно через среду. Для этого локальная переменная должна быть экспортирована (включена) в среду, в которой исполняется процедура, использующая эту переменную. Среда пользователя, т.е. глобальные переменные, доступна всем процессам для чтения и переопределения. Экспортирования не требуют переменные, созданные в теле самой процедуры. Процедура является порожденным процессом по отношению к оболочке, т.е. порожденный процесс не может изменить значения локальных переменных родительского процесса. 97
Три формата команды экспортирования: $export список имен локальных переменных $export имя_лок_переменной=значение $export (без параметров) — выводит перечень всех экспортированных локальных и переменных среды (аналог команды env). Рассмотрим некоторый фрагмент протокола работы с системой. $color = red # переменная определена, но не экспортирована; $export count = 1 # переменная определена и экспортирована, # т.е. потенциально доступна всем порождаемым процессам. $export PATH = ….. HOME = ….. color = red count = 1 # это собственные (глобальные) переменные shell $cat>proc1 # создание порожденного процесса процедуры proc1 echo $color echo $count exit # выход в ОС после завершения процедуры$proc1 # выполнение процедуры 1 # на экран выводится значение только одной экспортированной # переменной count; вторая переменная color не определена $cat>proc2 # еще одна процедура proc2 color = black count = 2 echo $color echo $count exit $proc2 black 98
2 # выводятся значения обеих переменных, так как они # определены в самой поцедуре $echo $color red $echo $count 1 $ На экран выводятся первоначальные значения переменных (color и count) родительскoго процесса — shell. Новые (измененные) значения локальных переменных существуют только на время существования породившего их порожденного процесса. Чтобы изменить значение переменной родительского процесса, ее надо экспортировать. Но после завершения порожденного процесса среда родительского восстанавливается. Еще пример: $export color=black $ksh # далее работа в ksh $echo $color black $color = red $echo $color red $exit # выход из ksh в родительский shell $echo $color black $ Здесь порожденным процессом является вторичная оболочка Korn schell. Среда родительского процесса не изменена, т.е. сохранилось значение экспортированной в нее переменной. Порожденные процессы не могут изменить среду родительских процессов.
99
Вопросы для самоконтроля 1. Понятие shell-процедуры. Создание. Исполнение. Завершение работы. Примеры. 2. Понятие процедур в ОС UNIX. Передача и обработка параметров. Примеры. 3. Основные принципы построения операционных систем. 4. Команда ввода строки текста со стандартного устройства ввода. Обработка элементов строки. Пример. 5. Локальные переменные языка shell. Разновидности и назначение. Присваивание и подстановка значений переменных. Примеры. 6. Локальные переменные ОС UNIX. Подстановка результатов работы команд, командных строк и процедур. Примеры. 7. Три вида подстановок значений переменных. Примеры. 8. Обзор команд вычисления выражений арифметических операций. Результаты операций. Примеры. 9. Обзор команд анализа строк символов. Результаты операций. Примеры. 10. Экспортирование переменных. Назначение. Команды. Примеры.
100
8. ВВЕДЕНИЕ В SHELL-ПРОГРАММИРОВАНИЕ. АЛГОРИТМЫ ПРОЦЕДУР 8.1. ПРОВЕРКА УСЛОВИЙ Все команды UNIX вырабатывают код завершения (возврата), обычно для того чтобы в дальнейшем можно было выполнить диагностику посредством проверки значения кода завершения и определить: нормально завершилось выполнение команды (=0 или true) или ненормально (> 0 или false). Например, если (=1), то ошибка синтаксическая. Код завершения после выполнения каждой команды помещается автоматически в некоторую специальную системную переменную и ее значение можно вывести на экран: echo $? Пример: $true # коду завершения присваивается истинное значение $echo $? 0 $ls $echo $? 0 $false # коду завершения присваивается ложное значение $echo $? 1 $cp <сообщение о некорректности заданной команды – нет параметров> $echo $? 1 # некорректное завершение команды cp $echo $? 0 # корректное завершение команды echo $ Код завершения используется для программирования условных переходов в sh-процедурах. Проверка истинности условий для по101
следующего ветвления вычислительного процесса процедур может быть выполнена с помощью команды: test <проверяемое отношение/условие> Вместо мнемоники команды может использоваться конструкция c квадратными скобками: [проверяемое отношение/условие] — синоним команды test. Аргументами этой команды могут быть имена файлов, числовые или нечисловые строки (цепочки символов). Командой вырабатывается только код завершения (код возврата), соответствующий закодированному в команде test условию. Код завершения проверяется следующей командой. Если закодированное параметрами условие выполняется, то вырабатывается логический результат (значение некоторой системной переменной) – true, если нет — false. Код возврата может обрабатываться как следующей за test командой, так и специальной конструкцией языка: if-then-else-fi. 1. Проверка файлов: test -к имя_файла Ключи: -r — файл существует и доступен для чтения; -w — файл существует и доступен для записи; -x — файл существует и доступен для исполнения; -f — файл существует и имеет тип "-", т.е. обычный файл; -s — файл существует, имеет тип "-" и не пуст; -d — файл существует и имеет тип "d", т.е. файл-каталог. …………………….. 2. Сравнение числовых значений: test число1 –к число2 Числа могут быть как просто числовыми строками, так и переменными, которым эти строки присвоены в качестве значений. Ключи для анализа числовых значений: -eq — равно; -ne — не равно; 102
-lt — меньше; -gt — больше;
-le — меньше или равно; -ge — больше или равно.
Пример: $x=5 $[$x -lt 7] $echo $? 0 $[$x -gt 7] $echo $? 1 $ 3. Сравнение строк: test [-n] 'строка' — строка не пуста (n – число проверяемых строк); test -z 'строка' — строка пуста; test 'строка1' = 'строка2' — строки равны; test 'строка1' != 'строка2' — строки не равны. Необходимо заметить, что все аргументы команды test — строки, имена, числа, ключи и знаки операций являются самостоятельными аргументами и должны разделяться пробелами. Пример: $x = abc $["$x" = "abc"] $echo $? 0 $["$x" != "abc"] $echo $? 1 $ ЗАМЕЧАНИЕ. Выражение вида "$переменная" лучше заключать в двойные кавычки, что предотвращает в некоторых ситуациях возможную неподходящую замену переменных shell. Особенности сравнения чисел и строк. Shell трактует все аргументы как числа в случае, если осуществляется сравнение чисел, и все аргументы как строки, если осуществляется сравнение строк. 103
Пример: $X = 03 $Y =3 $["$X -eq "$Y"] # сравниваются значения чисел; $echo $? 0 $["$X = "$Y"] # числа сравниваются как строки символов. $echo $? 1 $ Ещё примеры на сравнение строк и чисел: x=abc;[abc = “$x”];echo $? 0 # «истина», строки равны; х=05; test 5 = “$x”; echo $? 1 # «ложь», строки не равны; х=05; [5 –eq “$x”]; echo $? 0 # «истина», сравниваются числовые значения и они равны. $ 8.2. ВЕТВЛЕНИЕ ВЫЧИСЛИТЕЛЬНЫХ ПРОЦЕССОВ Ветвление вычислительного процесса в shell-процедурах осуществляется семантической конструкцией: if список_команд1 then список_команд2 [else список_команд3 fi Список_команд — это одна команда, или несколько команд, или фрагмент shell-процедуры. Если команды записаны на одной строке, то они разделяются точкой с запятой. Для задания пустого списка команд следует использовать специальный оператор: : (двоеточие) — пустой оператор. 104
Список_команд1 передает оператору if код завершения последней выполненной в нем команды. Если он равен 0, то выполняется список_команд2. Таким образом, код возврата 0 эквивалентен логическому значению "истина". В противном случае он эквивалентен логическому значению "ложь" и выполняется либо список_команд3 после конструкции else, либо завершение конструкции if словом fi. В качестве списка_команд1 могут использоваться списки любых команд. Однако чаще других используется команда test. В операторе if также допускаются две формы записи этой команды: if test аргументы if [ аргументы ] Каждый оператор if произвольного уровня вложенности обязательно должен завершаться словом fi. ЗАДАНИЕ. Создать и выполнить файл с процедурой, сравнивающей передаваемый ей параметр с некоторым набором символов (паролем). $ cat>com if test 'param' = "$1" # сравниваются строки символов; then echo Y else echo N fi$ chmod u+x com # запуск процедуры com на исполнение. $ com param Y $ com parm N $ ЗАДАНИЕ. Организовать ветвление вычислительного процесса в процедуре в зависимости от значения переменной Х (<10, >10, = 10). if
[$X -lt 10] then echo X is less 10 else if [$X -gt 10] 105
fi
then echo X is greatr 10 else echo X is equal to 10 fi
Для улучшения восприятия программ и облегчения отладки целесообразно придерживаться структурированного стиля написания программы. Каждому if должен соответствовать свой fi. 8.3. ПОСТРОЕНИЕ ЦИКЛОВ Циклы обеспечивают многократное выполнение отдельных участков процедуры до достижения заданных условий. Цикл типа while (пока true): while список_команд1 do список_команд2 done Список_команд1 возвращает код возврата последней выполненной команды. Если условие истинно, выполняется список_команд2, затем снова список_команд1 с целью проверки условия, а если ложно, выполнение цикла завершается. Таким образом, циклический список_команд2 (тело цикла) выполняется до тех пор, пока условие истинно. Пример 1. Простая процедура организации счетчика на заданное число циклов. var=0 caunt=10 while [“$var” –lt “$caunt”] do echo “$var” var=`expr $var + 1` done exit 106
Пример 2. Проверка наличия параметров при обращении к данной процедуре. Вывод на экран сообщений о наличии параметров и тексты параметров. Текст процедуры, которой присвоено имя Р2: if $1 –eq 0 then echo “No param” else echo “Param:’; while test ‘$1’ do echo “$1” shift done fi Результат работы процедуры: $P2 No param $P1 abc df egh Param: abc df egh $ Пример 3. Ввод строки из нескольких слов. Подсчет и вывод числа символов в каждом слове. Текст процедуры, которой присвоено имя P3: echo “Input string:” read A set $A while [ “$1” ] do echo “$1 = `expr ”$1” : ‘.*’`” shift done Результат работы процедуры: $P3 Input string: df ghghhhh aqw 107
df = 2 ghghhhh = 7 aqw = 3 $ Пример 4. Вывести на экран слово строки (поле), номер которого (переменная N) указан в параметре при обращении к процедуре, которой присвоено имя P4. Процедура запрашивает ввод строки с клавиатуры. Номер слова вводится как аргумент процедуры. Текст процедуры P4: i=1 # счетчик номеров слов в строке, формируется при каждом # выполнении цикла; N=$1 # значение первого параметра; echo "Введи строку: " read a set $a while test $i -lt $N do i=`expr $i + 1` — формирование номера следующего слова. shift done echo "$N поле строки: \"$1\"" Пример работы процедуры P4: $P4 2 Введи строку: aa bb cc dd 2 поле строки: "bb" $ Цикл типа until (пока false): until список_команд1 do список_команд2 done Логическое условие, определяемое по коду возврата списка_команд1, инвертируется, т.е. цикл выполняется до тех пор, пока 108
условие ложно. Условие цикла проверяется после каждого (в том числе и первого) выполнения циклического участка процедуры. Пример процендуры с именем P5, выполняющей заданное число циклов: $cat>P5 X=1 # cчетчик числа циклов until test $X -gt 10 # задано число циклов = 10 do echo X is $X X = `expr $X + 1` done$sh P4 X is 1 X is 2 ................. X is 10 $ Пример процедуры, предусматривающей завершение цикла по ключевому слову end: until [“$var” = end] do echo “Введите значение переменной #1” echo “end – выход” read var echo “значение переменной #1 = $var” done exit Цикл типа for: for имя_ переменной [in список_значений] do список_команд done
109
Переменная с указанным в команде именем заводится автоматически. Переменной присваивается значение очередного слова из списка_значений и для этого значения выполняется список_команд. Количество итераций равно количеству значений в списке, разделенных пробелами (т.е. циклы выполняются, пока список не будет исчерпан). Пример текста процедуры, печатающей в столбец список имен файлов текущего каталога: list =`ls` for val in $list do echo "$val" done echo end Пример процедуры, которая должна скопировать все обычные файлы из текущего каталога в каталог, который задается в качестве аргумента при обращении к данной процедуре по имени comfil. Процедура проверяет также наличие каталога-адресата и сообщает количество скопированных файлов: m=0 — переменная для счетчика скопированных файлов if [ -d $HOME/$1 ] then echo "Каталог $1 существует" else mkdir $HOME/$1 . echo "Каталог $1 создан" fi for file in * do if [ -f "$file" ] then cp "$file" $HOME/$1; m=`expr $m + 1` fi done echo "Число скопированных файлов: $m" Выполнение процедуры: $sh comfil dir1 Число скопированных файлов:…. $ 110
Здесь символ * имеет смысл <список_имен_файлов_текущего_ каталога>. Пример процедуры PROC, выводящей на экран имена файлов из текущего каталога, число символов в имени которых не превышает заданного параметром числа: if [ “$1” = “” ] then exit fi for nam in * do size = `expr $nam : ‘.*’` if [ “$size” –le “$1” ] then echo “Длина имени $nam $size символа” fi done Вывод содержимого текущего каталога процедуры: $ ls –l total 4 drwxrwxrwx 2 lev lev 1024 Feb 7 18:18 -rw-rw-r-1 lev lev 755 Feb 7 18:24 -rwxr-xr-x 1 lev lev 115 Feb 7 17:55 -rwxr-xr-x 1 lev lev 96 Feb 7 18:00 $ Результаты работы процедуры: $ PROC 2 Длина имени f1 2 символа Длина имени f2 2 символа $PROC 3 Длина имени out 3 символа Длина имени f1 2 символа Длина имени f2 2 символа $
111
для проверки работы
dir1 out f1 f2
Пример. Процедура с именем PR выводит на экран из указанного параметром подкаталога имена файлов с указанием их типа. cd $1 for fil in * do If [ -d $fil] then echo “$fil – catalog” else echo “$fil – file” fi done Вывод содержимого подкаталога для проверки работы процедуры: $ ls –l pdir total 4 drwxrwxrwx 2 lev lev 1024 Feb 7 18:18 dir1 -rw-rw-r-1 lev lev 755 Feb 7 18:24 out -rwxr-xr-x 1 lev lev 115 Feb 7 17:55 f1 -rwxr-xr-x 1 lev lev 96 Feb 7 18:00 f2 Результаты работы процедуры: $ PR pdir dir1 – catalog out – file f1 – file f2 – file $ Пример циклической процедуры, которая сортирует строки исходных файлов и переписывает отсортированное содержимое исходных файлов в новые файлы с чпастично совпадающими именами: for i in f1 f2 f3 do cat $i|sort>${i}_rez # отсортированные тексты перепишутся в файлы # f1-rez, f2-rez, f3-rez done
112
Некоторые дополнительные команды, которые могут быть использованы в процедурах: sleep t — приостанавливает выполнение процесса на t секунд. Пример. Бесконечная (циклическая) процедура выводит каждые пять секунд сообщение в указанный файл fil: while true do echo “текст_сообщения”>fil sleep 5 done Примечания: 1. Вместо файла (или экрана) может быть использовано фиктивное устройство /dev/null (например, для отладки процедуры). 2. В процедуре реализуется бесконечный цикл. Для ограничения числа циклов надо предусмотреть счетчик циклов (см. выше) или прекратить выполнение процесса процедуры с помощью команды управления процессами $kill (см. ниже).
exit [n] — прекращение выполнения процедуры с кодом завершения [n] или с кодом завершения последней выполненной команды. В качестве “n” можно использовать любое число, например, для идентификации выхода из сложной процедуры, имеющей несколько причин завершения выполнения. Вопросы для самоконтроля 1. Понятие кодов завершения выполнения команд. Средства анализа кодов. Примеры. 2. Результаты проверки файлов, сравнения числовых значений и символьных строк. Как анализируются результаты и для каких целей используются? Примеры. 3. Механизм выработки и проверки условий в shell-процедурах. 4. Команда проверки истинности отношений при проверке файлов, числовых значений и анализе символьных строк. Синтаксис команды. Примеры. 5. Средства ветвления вычислительных процессов в shellпроцедурах. Семантика конструкции. Пример. 6. Средства проверки условий и организации циклов типа «пока истина» в процедурах. Семантика конструкции. Пример. 7. Средства проверки условий и организации циклов типа «пока ложь»l в процедурах. Семантика конструкции. Пример. 8. Средства проверки условий и организации циклов с перебором списка переменных в процедурах. Семантика конструкции. Пример. 113
9. СОЗДАНИЕ И РЕДАКТИРОВАНИЕ ТЕКСТОВЫХ ФАЙЛОВ И ПРОЦЕДУР Во всех версиях ОС UNIX имеется встроенный текстовый редактор vi экранного типа. Он может применяться практически на любом терминале, начиная с телетайпа. Редактор является универсальным средством, доступным в среде любой UNIX-подобной ОС. 9.1. КОМАНДЫ И РЕЖИМЫ РАБОТЫ С РЕДАКТОРОМ VI Экранный текстовый редактор vi в настоящее время является неотъемлемой частью любой операционной системы семейства UNIX. Кроме того, он часто используется в качестве редактора командной строки в современных версиях shell. Отличительной особенностью этого редактора является то, что вводимые команды не отображаются на экране и пользователь видит только результат их выполнения. Однако это не вызывает неудобств в работе пользователя, так как редактирование осуществляется в буфере, куда загружается редактируемый текст из исходного файла с последующей записью из буфера в исходный (или другой) файл по окончании редактирования и выходе из редактора. При работе с редактором важно помнить, что он может функционировать в трех различных режимах: командном режиме, режиме ввода и режиме последней строки (префиксные команды). В начале редактирования при вызове редактора командой vi включается командный режим. В дальнейшем пользователь может переходить из режима в режим, выполняя определенные команды, а именно: для перехода из командного режима в режим ввода – команды i, I, a, A, o, O; для перехода из режима ввода в командный режим – команду ESC, для перехода из командного режима в режим последней строки – команды ?, /, :, для перехода из режима последней строки – команду ENTER. В режиме последней строки вызывается строковый редактор ex, команды которого отображаются на экране. Для начального освоения редактора vi не следует стремиться использовать весь арсенал имеющихся в нем команд, можно ограничиться основными, которые приведены в кратком справочнике в данном пособии. Следует также иметь в виду, что все современные 114
версии редактора vi поддерживают перемещение курсора с помощью специальных клавиш клавиатуры (Left, Right, Up, Down), тем самым избавляя пользователя от необходимости применять соответствующие команды редактора. Для ускорения редактирования каждая команда редактора может выполняться многократно в соответствии с коэффициентом повторения (числом, вводимым перед соответствующей командой). Редактор богат своими функциональными возможностями. Мы ограничимся наиболее часто используемыми функциями при составлении обычных текстов, текстов процедур и пр. Основная особенность – при редактировании текста в качестве управляющих используются обычные клавиши алфавитно-цифровой клавиатуры, а позиционирование осуществляется только относительно текущего положения курсора. Начало работы с редактором: $vi имя_файла [*] — вызов редактора и файла. Если файл не существует, то создается новый пустой. Редактируемый файл переписывается в буфер. Далее все изменения в редактируемом файле соответственно осуществляются в буфере в КОМАНДНОМ РЕЖИМЕ — нажатые клавиши интерпретируются как команды редактирования текста. В командный режим редактор переводится автоматически сразу же после входа в программу vi. По завершении редактирования надо выйти из редактора с сохранением файла: <Esc>:wq! — отредактированная копия замещает исходный файл. Если же требуется отменить все редактирование, то: <Esc>:q! В режиме редактирования, например для ввода новых фрагментов текста файла, используются клавиши команды режима ввода текста (значения клавиш на экране не отображается): a (append) — набор последующего текста в текущую строку после курсора; i (insert) — вставка текста в текущую строку после курсора; o (open) — вставить пустую строку после текущей. 115
Замечание. Если в качестве управляющей используется клавиша нижнего регистра, операция редактирования реализуется после курсора, если верхнего — перед курсором. Операции ввода текста необходимо завершить командой <Esc> — переводит редактор в режим редактирования последнего варианта текста. В командном режиме могут исполняться и другие группы команд. Команды управления курсором в области текста файла. Два способа: использование специальных клавиш-команд (например, $ или ^); использование общеизвестных управляющих клавиш клавиатуры. Команды удаления текста: х — удаление текущего символа; [#]dw — удаление # текущих слов; [#]dd —удаление текущих строк; dG — удаление всех строк от текущей до последней; dS — удаление конца строки от текущей позиции; d^ — удаление начала строки до текущей позиции. Замечание. Удаленные фрагменты текста не пропадают, а временно помещаются в буфер, откуда они могут быть возвращены в текст или перемещены по файлу (см. ниже). Команды отмены произведенных изменений в текущей строке: u — отмена (undo) последнего изменения; U — отмена всех изменений. Команды копирования указанного в команде объекта в буфер: [#]yw — копирование (yank) текущего слова; [#]yy — копирование текущей строки; уG — копирование строк от текущей до конца файла; yS — копирование части строки от курсора до конца строки; y^ — копирование части строки от курсора до начала строки.
116
Команды вставки буфера в текст: P — перед курсором; p — после курсора. Команды изменения текста: r<символ> — заменяет (change) текущий символ на указанный; с<объект> — заменяет указанный объект на текст, который вводится с клавиатуры - <Esc>; -#cw — изменение текущего слова; -#cc — всей текущей строки; -cG — всех строк файла от текущей до последней; -cS — части строки от курсора до конца строки; -с^ — части строки от курсора до начала строки. Команды поиска строки файла по фрагменту текста: /<текст> — начиная от текущей строки до конца файла с переходом на его начало; ?<текст> — начиная от текущей строки до начала файла и по всему файлу; n — поиск следующей строки в файле, аналогичной найденной; N—- поиск предыдущего вхождения в файл заданной строки. Редактор имеет возможности поиска строк по шаблонам (например по диапазону символов) и пр. На экране содержимое редактируемого файла представляется как бы через некоторое окно со следующими полями (сверху-вниз): - область текста файла; - область пустых строк, которые надо ввести, если они понадобятся; - тильда (~) — область для ввода дополнительного текста файла, но пустых строк этой области в файле нет; - область сообщений редактора или область префиксных exкоманд — операций редактора над группой строк файла или над целым файлом (команды вводятся на приглашение ":", отображаются на экране и исполняются по команде управляющей клавиши перевода строки).
117
Префиксные команды используются для многострочных операций с редактируемым файлом и настройки сеанса редактирования: :w файл — запись текущего буфера в файл; :m,nw файл — запись строк с m-й по n-ю в файл; :e! — отмена всех изменений в буфере с перезагрузкой в него файла с диска; :e файл — загрузка файла в буфер редактирования, файл замещает старое содержимое самого буфера; :r файл — добавление содержимого файла после текущего положения курсора; :set опция — значение опций определяет настройку редактора и пр. 9.2. УПРАЖНЕНИЯ ДЛЯ ПРАКТИЧЕСКОГО ОСВОЕНИЯ РЕДАКТОРА Упражнения и методика их выполнения направлены на практическое освоение основных возможностей встроенного текстового редактора vi. Работа может выполняться в среде любой ОС UNIX. Изучаются команды: вход в редактор и выход, сохранение файлов; ввода текста; удаления фрагментов текста; копирования фрагментов текста в буферную область памяти; вставки содержимого буфера в текст файла; редактирования (изменения) текста; поиска строк файлов по их фрагментам; многострочных операций с файлом (префиксные команды). МЕТОДИКА ВЫПОЛНЕНИЯ 1. Войдите в редактор с созданием нового пустого файла с произвольным именем и расширением - .1. 2. Поместите в созданный файл текст, включающий не менее четырех строк с несколькими словами в каждой. 3. Вставьте по одной пустой строке до и после одной из строк файла. 4. Заполните пустые строки произвольным текстом. 118
5. Вставьте еще по одной строке в середину текста файла без предварительного резервирования пустых строк. 6. Перейдите в режим редактирования и выполните произвольное редактирование отдельных слов и строк файла с использованием всех команд из групп "Команды изменения текста" и "Команды отмены произведенных изменений в текущей строке". 7. Выйдите из редактора с сохранением файла. Убедитесь в сохранении созданного файла. 8. Войдите опять в vi для редактирования созданного файла с использованием команд из групп "Команды копирования в буфер" и "Команды вставки буфера в текст". 9. Поменяйте местами несколько слов в строках файла. 10. Поменяйте местами несколько строк. 11. Поменяйте местами последовательно начало строки с её концом и наоборот. 12. Выполните операции поиска строк файла по заданным их фрагментам с различными направлениями поиска (см. "Команды поиска строки файла по фрагменту её текста"). 13. Не выходя из vi, перепишите полученную в результате редактирования версию файла в файл с тем же именем, но с расширением .new. 14. Добавьте первые три строки редактируемого файла к файлу .1. 16. Не выходя из vi, загрузите в буфер файл с расширением .1. 17. Последовательно удалите части строк и несколько строк с использованием команд из группы "Команды удаления текста". 18. Выйдите из редактора без сохранения файла. 19. Просмотрите и проанализируйте содержимое редактируемых файлов в текущем каталоге. 20. Уничтожьте созданные файлы. Вопросы для самоконтроля 1. В чем осорбенности и преимущества встроенного редактора vi ОС UNIX? 2. Какие два основных режима работы использует редактор? Как осуществляется переключение режимов? 3. Какую структуру имеет экран при редактировании файла? Назначение полей экрана. 119
4. Как в vi организовано редактирование открытого в нем файла? 5. Как организована работа с клавишными командами редактора? 6. Что такое “префиксные команды” и их назначение? Как организована работа с командами этого вида? 7. Какие функции редактора Вы использовали при выполнении лабораторной работы?
10. ПРИМЕРЫ SHELL-ПРОГРАММИРОВАНИЯ Язык shell операционной системы UNIX предоставляет программисту очень широкие возможности и почти всегда позволяет решить любую задачу несколькими способами, используя различные сочетания команд. Однако для начального ознакомления с возможностями языка рекомендуется применять простейшие команды, рассмотренные ранее в настоящем пособии. Для каждой из процедур предлагается вариант выполнения с передачей ей через параметры конкретных данных. Все решения проверены в реальной операционной системе OS Linux в среде shell GNU bash (версия 3.2.39). Для лучшего понимания смысла процедур рекомендуется их пошаговое выполнение с анализом промежуточных результатов выполнения каждой строки. 10.1. ПЕРЕДАЧА ПАРАМЕТРОВ В ПРОЦЕДУРУ 1. Написать процедуру, выводящую на экран текущую дату и время, полное маршрутное имя текущего каталога, полное маршрутное имя домашнего каталога пользователя, регистрационное имя пользователя, собственное имя процедуры. Решение: #proc1.1 #Вывод на экран текущей даты и времени
120
date #Вывод на экран полного маршрутного имени текущего каталога pwd #Вывод на экран полного маршрутного имени домашнего каталога пользователя echo $HOME #Вывод на экран регистрационного имени пользователя who am i #Вывод на экран собственного имени процедуры echo $0 #Конец процедуры proc1.1 Пример выполнения процедуры proc1.1: $proc1.1 /home/user1/posobie /home/user1 user1 pts/1 2009-02-05 10:19 proc1.1 2. Написать процедуру, выводящую на экран все переданные процедуре параметры: текущую дату и время, полное маршрутное имя текущего каталога, полное маршрутное имя домашнего каталога пользователя, регистрационное имя пользователя, собственное имя процедуры, количество переданных в процедуру параметров. Решение. С помощью одной команды echo можно вывести на экран значения позиционных параметров, передаваемых в процедуру при ее вызове. В качестве параметров в процедуру передаются результаты выполнения соответствующих команд UNIX. #proc1.2 #Вывод на экран значений первого, второго, третьего и четвертого позиционных параметров, переданных процедуре при обращении, а также #нулевого параметра, содержащего имя выполняемой процедуры 121
echo $1 $2 $3 $4 $0 #Конец процедуры proc1.2 Пример выполнения процедуры proc1.2: #proc1.2 `date` ` pwd` $HOME ` who am i` /home/user1/posobie user1 pts/1 2007-02-05 proc1.2 10.2. РАБОТА С ФАЙЛАМИ 1. Написать процедуру, выводящую на экран содержимое файла, имя которого передается в процедуру в качестве параметра. Решение: #proc2.1 #Вывод на экран cодержимого файла $1 cat $1 #Конец процедуры proc2.1 Пример выполнения процедуры proc2.1: $proc2.1 file1.1 # pwd # echo $HOME # who am i # echo $0 #proc1.1 2. Написать процедуру, копирующую содержимое первого файла во второй файл. Имена файлов передаются в процедуру в качестве параметров. Решение: #proc2.2 #Копирование содержимого файла $1 #в файл $2 cp $1 $2 122
#Конец процедуры proc2.2 Пример выполнения процедуры proc2.2: $proc2.2 file1.1 file1.2 3. Написать процедуру, записывающую в некоторый файл текст, вводимый с клавиатуры при работе процедуры. Имя файла передается в процедуру в качестве параметра. В конце текста должна быть текущая дата. Решение: #proc2.3 echo Введите текст read $TEMP1 echo $TEMP1 >$1 date >TEMP2 cat $1 TEMP2 >TEMP1 mv TEMP1 $1 #Конец процедуры proc2.3 Пример выполнения процедуры proc2.3: $proc2.3 fff Введите текст this text is test <ENTER> $cat fff this text is test Сбт Фев 24 17:10:36 MSK 2009 4. Написать процедуру, вводящую в начало файла_1 некоторый текст с клавиатуры, затем присоединяющего содержимое файла_2, затем снова вводящего текст с клавиатуры в конец файла_1. Имена файлов передаются в процедуру в качестве параметров. Решение: #proc2.4 cat - $1 >TEMP1 cat TEMP1 $2 >$1 #
123
Пример выполнения процедуры proc2.4: $cat fff $proc2.4 fff ffff $cat ffff 5. Написать процедуру, меняющую взаимно содержимое двух файлов. Имена файлов передаются в процедуру в качестве параметров. Решение: $proc2.5 cp $1 TEMP1 mv $1 $2 mv TEMP1 $2 #Конец процедуры proc2.5 Пример выполнения процедуры proc2.5: $cat file1 111111111111111111111 $cat file2 222222222222222222222 $proc2.5 file1 file2 $cat file1 222222222222222222222 $cat file2 111111111111111111111 10.3. РАБОТА С СИМВОЛЬНЫМИ СТРОКАМИ 1. Написать процедуру, вводящую в начало существующего файла_1 некоторый текст_1 с клавиатуры, затем присоединяющую к нему содержимое файла_2, затем присоединяющую в конец файла_1 введенный с клавиатуры текст_2. Имена файлов передаются в процедуру в качестве параметров. Решение: #proc3.1 #Ввод с клавиатуры текста_1 в промежуточный #файл file cat >file 124
#Присоединение содержимого файла $2 к промежуточному файлу и запись результата в файл TEMP cat file $1 $2 > TEMP #Присоединение в конец файла $1 текста_2, введенного с клавиатуры cat TEMP - >>$1 #Конец процедуры Proc3.1 Пример выполнения процедуры proc3.1: $cat f1 111111111111 $cat f2 222222222222 $proc3.1 f1 f2 +++++++++---------------------- $cat f1 +++++++++ 111111111111 222222222222 ---------------------$ 2. Написать процедуру, находящую в файле, имя которого передается в качестве параметра, все строки, содержащие вводимую с клавиатуры во время работы процедуры последовательность символов. Решение: #proc3.2 #Ввод с клавиатуры заданной последовательности #символов и запись ее в переменную A read A #Поиск в заданном файле всех строк, содержащих #заданную последовательность grep $A $1 #Конец процедуры Proc3.2 Пример выполнения процедуры proc3.2: $cat f1 1234567890 0987654321 qwe456rtyu asd34567fg 456456456 125
$proc3.2 f1 1234567890 qwe456rtyu asd34567fg 456456456 3. Написать процедуру, помещающую в заданный первым параметром файл отсортированные по алфавиту строки с информацией о работающих в системе пользователях. Решение: #proc3.3 who | sort > $1 #Конец процедуры Proc3.3 Пример выполнения процедуры proc3.3: $proc3.3 testing $cat testing user1 :0 2007-02-25 15:57 (console) user1 pts/0 2007-02-25 15:57 user1 pts/1 2007-02-25 16:06 $ 4. Написать процедуру, распределяющую строки заданного первым параметром символьного файла поровну между двумя другими файлами, имена которых передаются в качестве второго и третьего параметров. Решение: #proc3.4 #Определение числа строк в исходном файле wc –l $1 >TEMP L1=`cut -f1 -d' ' TEMP` #Определение числа строк в файле $2 L2=`expr $L1 / 2` #Определение числа строк в файле $3 L3=`expr $L1 – $L2` #Запись в файл $2 первой половины файла $1 head -$L2 $1 >$2 #Запись в файл $3 второй половины файла $1 tail -$L3 $1 >$3 #Конец процедуры Proc3.4 126
Пример выполнения процедуры proc3.4: $cat f1 1 2 3 4 5 6 $proc3.4 f1 f2 f3 $cat f2 1 2 3 $cat f3 4 5 6 $ 10.4. ВЫЧИСЛЕНИЕ АРИФМЕТИЧЕСКИХ ВЫРАЖЕНИЙ 1. Написать процедуру, вводящую с клавиатуры два целых числа и выводящую на экран их сумму, произведение и частное от деления первого числа на второе. Решение: #proc4.1 #Ввод с клавиатуры двух целых чисел и присваивание их переменным A и B. read A B #Вычисление суммы введенных чисел и присваивание ее переменной SUM SUM=`expr $A + $B` #Вычисление произведения введенных чисел и присваивание результата переменной PROD PROD=`expr $A \* $B` #Вычисление частного от деления первого введенного числа на второе и присваивание результата переменной QUOT 127
QUOT =`expr $A \/ $B` #Вывод на экран полученных результатов echo Сумма введенных чисел равна echo $SUM echo Произведение введенных чисел равно echo $PROD echo Частное от деления первого числа на второе равно echo $QUOT #Конец процедуры Proc4.1 Пример выполнения процедуры proc4.1: $proc4.1 4 5 <enter> Сумма введенных чисел равна 9 Произведение введенных чисел равно 45 Частное от деления первого числа на второе равно 0 $ 2. Написать процедуру, выводящую на экран время в минутах, остающееся до назначенного срока от момента запуска процедуры на исполнение. Назначенный срок задается в виде: номер дня в году (первый параметр), час (второй параметр ), минута (третий параметр). Решение: #proc4.2 #Сохранение в файле file текущей даты date +%j%H%M >file #Сохранение в переменной TEMP1 текущего дня TEMP1=`cut -f1 file` #Сохранение в переменной TEMP2 текущего часа TEMP2=`cut -f1 file` #Сохранение в переменной TEMP3 текущей минуты TEMP3=`cut -f2 file` #Сохранение в переменной TEMP4 оставшихся суток TEMP4=`expr $1 - $TEMP1` 128
TEMP4=`expr $TEMP4 \* 60 \* 24` #Сохранение в переменной TEMP5 оставшихся часов TEMP5=`expr $2 - $TEMP2` TEMP5=`expr $TEMP5 \* 24` #Сохранение в переменной TEMP6 оставшихся минут TEMP6=`expr $3 - $TEMP3` #Вывод на экран результата echo До назначенного срока остается echo `expr $TEMP4 + $TEMP5 + $TEMP6` минут #Конец процедуры Proc4.2 Пример выполнения процедуры proc4.2: $proc4.2 2010 066 11 35 До назначенного срока остается 4293 минут 10.5. ИСПОЛЬЗОВАНИЕ КОНВЕЙЕРОВ 1. Написать процедуру, которая вставляет в заданный первым параметром файл вводимую при работе процедуры новую строку после строки, номер которой задается вторым параметром. Решение: proc5.1 #Ввод новой строки и запись ее в переменную #TEMP read TEMP #Запись в файл file первых $2 строк файла $1 head -$2 $1 >file1 #Запись в файл file2 содержимого TEMP echo $TEMP > file2 #Присоединение в конец файла file1 новой строки из файла file2 cat file1 file2 >file3 #Определение общего числа строк в исходном файле $1 L1=`wc –l $1` L1=`echo $L1 |cut -f1 -d" "` #Определение числа строк во второй части файла $1 L2=`expr $L1 - $2` #Запись в файл file2 второй части исходного файла tail -$L2 $1 > file2 #Объединение первой и второй частей результирующего файла cat file1 file2 >$1 #Конец процедуры Proc5.1 129
Пример выполнения процедуры proc5.1: $cat filen 111111111111111111111 2222222222222 3333333333333333333 4444444444444444444 $proc5.1 filen 2 =========================== $cat filen 111111111111111111111 2222222222222 =========================== 3333333333333333333 4444444444444444444 2. Написать процедуру, которая всем пользователям, работающим в данный момент в системе, посылает сообщение из заданного первым параметром файла. Решение: #proc5.2 mail `who |cut -f1 -d” “` <$1 #Конец процедуры Proc5.2 Пример выполнения процедуры proc5.2: $proc5.2 testing $ 10.6. ВЕТВЛЕНИЕ В ПРОЦЕДУРАХ 1. Написать процедуру, которая выводит на экран постранично содержимое одного из двух символьных файлов, имена которых передаются процедуре в качестве параметров. Выбрать файл с меньшим числом строк (код завершения 000). Если заданные файлы имеют одинаковое число строк, то вывести на экран cодержимое обоих файлов (код завершения 111). Решение: #proc6.1 #Запись в переменную TEMP1 числа строк в файле $1 TEMP1=`wc –l $1 | cut -f1 -d “ “` #Запись в переменную TEMP2 числа строк в файле $2 130
TEMP2=`wc –l $2 | cut -f1 -d “ “` #Выбор файла с меньшим числом строк if test $TEMP1 –lt $TEMP2 then #Вывод на экран содержимого файла $1 more $1 #Выход из процедуры exit 000 fi if test $TEMP2 -lt $TEMP1 test #Вывод на экран содержимого файла $2 more $2 #Выход из процедуры exit 000 fi #Проверка равенства числа строк в файлах $1 и $2 if test $TEMP1 –eq $TEMP2 test #Вывод на экран содержимого файлов $1 и $2 more $1 $2 #Выход из процедуры exit 111 fi #Конец процедуры Proc6.1 Пример выполнения процедуры proc6.1: $cat f1 111111111111111111111 22222222222222222222 33333333333333333333 44444444444444444444 $cat f2 11111111111111111111 22222222222222222222 $proc6.1 f1 f2 111111111111111111111111111 222222222222222222222222222 $ 131
2. Написать процедуру, которая находит во всех подкаталогах заданного первым параметром каталога обыкновенные файлы с односимвольными именами и изменяет имена найденных файлов на соответствующие двухсимвольные, например имя f заменяется на ff и т. д. Если найден хотя бы один такой файл, то процедура возвращает код завершения 0, в противном случае — 1. Код завершения вывести на экран. Решение: #proc6.2 #Поиск во всех подкаталогах файлов с односимвольными именами find –f -name ? $1 #Замена односимвольного имени на двухсимвольное -exec mv {} {}{} \; #Сохранение кода завершения в переменной TEMP TEMP=$? # Вывод на экран кода завершения echo $TEMP #Выход из процедуры exit $TEMP #Конец процедуры proc6.2 Пример выполнения процедуры proc6.2: $ls ~/new f ggg l s $ls ~/new/new1 a bbb c dd $proc6.2 ~/new 0 $ls ~/new ff ggg ll ss $ls ~/new/new1 aa bbb cc dd 3. Написать процедуру, которая: для всех файлов текущего каталога, содержащих заданную первым параметром подстроку, выводит на экран общее число таких строк в найденных файлах; 132
для всех файлов текущего каталога, содержащих заданную вторым параметром подстроку, выводит на экран общее число символов в найденных строках; для всех файлов текущего каталога, содержащих заданную третьим параметром подстроку, выводит на экран общее число слов в найденных строках. Вывести на экран сообщение о максимальном числе строк в указанных категориях. Решение: #proc6.3 #Поиск строк, содержащих заданную подстроку $1 if grep -d skip -h $1 * > file1 then #Подсчет общего числа найденных строк TEMP1=`wc -l file1 | cut -f1 -d" "` echo $TEMP1 rm file1 else TEMP1=0 echo $TEMP1 fi #Поиск строк, содержащих заданную подстроку $2 if grep -d skip -h $2 * > file2 then #Подсчет общего числа символов в найденных строках TEMP22=`wc -c file2 | cut -f1 -d" "` TEMP2=`wc -l file2 | cut -f1 -d" "` echo $TEMP22 rm file2 else TEMP22=0 echo $TEMP22 fi #Поиск строк, содержащих заданную подстроку $3 if grep -d skip -h $3 * > file3 then #Подсчет общего числа слов в найденных строках TEMP33=`wc -w file3 | cut -f1 -d" "` 133
TEMP3=`wc -l file3 | cut -f1 -d" "` echo $TEMP33 rm file3 else TEMP33=0 echo $TEMP33 fi #Нахождение максимального числа строк if test $TEMP1 -ge $TEMP2 -a $TEMP1 -ge $TEMP3 then echo $1 $TEMP1 fi if test $TEMP2 -ge $TEMP3 -a $TEMP2 -ge $TEMP1 then echo $2 $TEMP2 fi if test $TEMP3 -ge $TEMP1 -a $TEMP3 -ge $TEMP2 then echo $3 $TEMP3 fi #Конец процедуры Proc6.3 Пример выполнения процедуры proc6.3: $cat f1 123 456 789 123 456 789 $cat f2 456 123 789 789 789 789 $cat f3 456 456 456 456 456 456 456 456 456 $proc6.3 567 123 456 0 36 18 456 6 $ 134
10.7. ЦИКЛЫ В ПРОЦЕДУРАХ 1. Написать процедуру, которая: среди пользователей, работающих в данный момент времени в системе, находит всех пользователей, имена которых содержатся во вводимой в процедуру символьной строке; выводит на экран найденные имена пользователей. Решение: #proc7.1 #формирование в файле file списка работающих пользователей who >file #Ввод заданных имен пользователей echo “input string:” read temp # Присваивание позиционным параметрам заданных в строке имен пользователей set $temp # Поиск в файле file заданных имен и вывод их на экран while [ “$1” ] do # Поиск в файле file очередного имени grep $1 file shift done # Конец процедуры proc7.1 Пример выполнения процедуры proc7.1: $who user2 tty2 2007-03-12 15:52 user3 tty3 2007-03-12 16:18 user1 :0 2007-03-12 10:43 (console) user1 pts/0 2007-03-12 10:43 user1 pts/1 2007-03-12 10:50 $proc7.1 “input string:” user2 user3 user2 tty2 2007-03-12 15:52 user3 tty3 2007-03-12 16:18 $
135
2. Написать процедуру, которая: выполняет над вводимыми при работе процедуры целыми положительными числами указанное первым параметром действие; выводит на экран при вводе очередного числа результат выполнения указанного действия; заканчивает работу при вводе вместо очередного числа слова “stop”. Решение: #proc7.2 (вариант 1) #Инициализация переменной result для сложения и вычитания if [ $1 –eq “+” ] o [$1 –eq “-” ] then result=0 fi # Инициализация переменной result для умножения и деления if [ $1 –eq “\*” ] o [ $1 –eq “\/” ] then result=1 else exit fi # Сохранение в переменной action кода заданного действия action=$1 # Считывание очередного операнда read TEMP # Присвоение первому параметру процедуры очередного операнда set $TEMP # Цикл выполнения заданного действия while true do # Проверка конца ввода операндов if [ “$1” = “stop” ] then exit fi # Исключение деления на «0» if [ $action =”/” ] a [ $1 –eq 0 ] then exit fi # Выполнение заданного действия над очередным операндом result=`expr $result $action $1` shift 136
done # Вывод на экран результата echo “result=$result” # Конец процедуры Proc7.2 #proc7.2 (вариант 2) #Ввод первого операнда echo input first number read result #Сохранение операции action=$1 while true do #Ввод второго и последующих операндов echo input next number or "stop" read TEMP set $TEMP if [ "$1" = "stop" ] then exit fi #Проверка деления на «0» if [ $action = "\/" -a $1 = 0 ] then exit fi echo action $action #Выполнение очередной операции и вывод #результата if [ $action = "\*" ] then result=`expr $result \* $1` fi if [ $action = "\/" ] then result=`expr $result \/ $1` fi if [ $action = "-" ] then result=`expr $result - $1` 137
fi if [ $action = "+" ] then result=`expr $result + $1` fi echo "result=$result" shift done #Конец процедуры 7.2 Пример выполнения процедуры proc7.2 (вариант 2): $proc7.3 "\*" input first number 25 input next number or stop 2 action \* result=50 input next number or stop 3 action \* result=150 input next number or stop stop $ 3.Написать процедуру, которая: определяет высоту поддерева каталогов, начиная от каталога, передаваемого в качестве первого параметра; выводит на экран полные маршрутные имена всех подкаталогов, являющихся последними в полном маршрутном имени максимальной длины. Решение: #proc7.3 #Нахождение относительных маршрутных имен каталогов и сохранение их в файле find $1 -depth >file C1=`pwd` 138
H=0 for i in `cat file` do if [ -d $C1/$i ] then cd $C1/$i h=0 C2=$C1/$i #Определение высоты поддерева каталогов while [ $C2 != $C1/$1 ] do cd .. C2=`pwd` h=`expr $h + 1` done if [ $H -lt $h ] then H=$h fi fi done echo subtree height is $H #Нахождение и вывод на экран полных маршрутных имен каталогов cd $C1 for i in `cat file` do if [ -d $C1/$i ] then cd $C1/$i h=0 C2=$C1/$i while [ $C2 != $C1/$1 ] do cd .. C2=`pwd` h=`expr $h + 1` done if [ $H -eq $h ] 139
then echo "full routing name" echo $C1/$i fi fi done cd $C1 # Конец процедуры Proc7.3 Пример выполнения процедуры proc7.3: $ pwd /home/user1 $ mkdir catalog1 $cd catalog1 $ mkdir catalog11 catalog12 $ cd catalog11 $ mkdir catalog111 catalog112 $ cd ../.. $ proc7.4 catalog1 subtree height is 2 full routing name /home/user1/catalog1/catalog11/catalog111 full routing name /home/user1/catalog1/catalog11/catalog112 $ 10.8. ПРОЦЕДУРЫ С ИСПОЛЬЗОВАНИЕМ ТАЙМЕРА 1. Написать процедуру, которая выполняет следующие действия: читает содержимое первого файла, передаваемого в качестве первого параметра; читает содержимое второго файла, передаваемого в качестве второго параметра; если число строк в первом и втором файлах — различное, то выводит на экран каждые 10 с попеременно, начиная с первой, строки из первого и второго файлов, а затем – все оставшиеся строки большего из файлов;
140
если число строк в файлах одинаковое, то выводит на экран попеременно через каждые 10 с по одной строке, начиная с последней, строки из первого и второго файлов. Решение: #proc8.1 l1=`wc -l $1 | cut -f1 -d" "` l2=`wc -l $2 | cut -f1 -d" "` # Сравнение числа строк в заданных файлах if [ $l1 -ne $l2 ] then # Получение разности числа строк в первом и втором файлах if [ $l1 -gt $l2 ] then l3=`expr $l1 - $l2` flag=0 else l3=`expr $l2 - $l1` flag=1 fi # Вывод на экран попеременно строк первого и второго файлов в прямом порядке l4=1 while [ $l4 -le $l3 ] do # Вывод на экран очередной строки из первого файла head -$l4 $1 >file tail -1 file #Пауза 10 с sleep 10 # Вывод на экран очередной строки из второго файла head -$l4 $2 >file tail -1 file #Пауза 10 с sleep 10 l4=`expr $l4 + 1` done # Вывод на экран оставшихся строк первого или второго файла if [ $flag -eq 0 ] 141
then tail -`expr $l1 - $l4` $1 else tail -`expr $l2 - $l4` $2 fi else l4=1 while [ $l4 -le $l1 ] do # Вывод на экран очередной строки из первого файла tail -$l4 $1 >file head -1 file #Пауза 10 с sleep 10 # Вывод на экран очередной строки из второго файла tail -$l4 $2 >file head -1 file sleep 10 l4=`expr $l4 + 1` done fi # Конец процедуры Proc8.1 Пример выполнения процедуры proc8.1: $ cat > pp 111111 222222 333333 $ cat > tt 444444 555555 666666 $ proc8.1 pp tt 333333 666666 222222 555555 111111 444444 $ 142
2. Написать бесконечную процедуру, которая периодически, каждые 15 с, опрашивает систему и выводит на экран сведения о каждом вновь вошедшем в систему пользователе. Решение: #proc8.2 # Сохранение сведений о пользователях, работающих в системе в момент запуска процедуры на выполнение who >file1 # Сохранение списка имен работающих пользователей cut –f1 -d=” “ file1 >file3 # Бесконечный цикл while true do # Пауза 15 с sleep 15 # Сохранение сведений о работающих пользователях через 15 с who >file2 # Сохранение списка имен работающих пользователей cut –f1 -d=“ “ file2 >file4 # Поиск каждого нового пользователя в списке старых пользователей и вывод на экран сведений о каждом вновь вошедшем в систему пользователе for newuser in file4 do if grep $newuser file3 then continue else grep $newuser file2 fi done # Обновление сведений о работающих пользователях cp file4 file3 done # Конец процедуры Proc8.2 Пример выполнения процедуры proc8.2: $ proc8.2 user3 tty2 2009-09-24-03-17 23:05 $
143
11. ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОГО ПРОГРАММИРОВАНИЯ ПРОЦЕДУР Для лучшего усвоения и закрепления материала настоящего пособия рекомендуется выполнить программирование с обязательной отладкой в среде любой ОС семейства UNIX всех приведенных ниже shell-процедур. Предлагаемые варианты, как правило, содержат несколько заданий в одной процедуре, каждое из которых может рассматриваться отдельно от других. Поэтому целесообразно программировать такую процедуру по частям, а затем объединить отлаженные части в единую процедуру. Такой подход предпочтительнее еще и потому, что позволяет учащемуся сконцентрировать свое внимание одновременно на относительно небольшом числе изучаемых команд системы и облегчает поиск и устранение допущенных ошибок. Для программирования процедур достаточно использовать только те средства ОС UNIX, которые рассматриваются в настоящем учебном пособии. Вариант 1. Написать shell-процедуру, которая: • вводит передаваемое в качестве 1-го параметра количество символьных строк; • в каждой введенной строке ищет подстроку, передаваемую в качестве второго параметра; • заменяет каждую найденную подстроку на строку, передаваемую в качестве третьего параметра; • выводит на экран каждую введенную строку и соответствующую ей новую строку. Вариант 2. Написать shell-процедуру, которая: • удаляет из заданного первым параметром каталога и всех содержащихся в нем подкаталогов файлы, дата последней модификации которых предшествует текущей дате минус число дней, переданное в качестве второго параметра; • изменяет дату последней модификации всех остальных файлов указанного каталога на текущую без изменения содержимого файлов. 144
Вариант 3. Написать shell-процедуру, которая: • всем пользователям, работающим в данный момент в системе из числа тех, чьи имена задаются третьим и последующими параметрами, рассылает сообщения из файла, имя которого передается вторым параметром; • повторяет сообщения с периодичностью, задаваемой первым параметром (в секундах); • прекращает выдачу сообщений и заканчивает работу при вводе с клавиатуры слова quit. Вариант 4. Написать shell-процедуру, которая: • вводит с клавиатуры терминала некоторое целое число; • всем пользователям, работающим в данный момент в системе, посылает сообщение о числе порожденных ими процессов; • тем пользователям, у которых число процессов больше введенного числа, посылает второе сообщение с предупреждением и на этом заканчивает свою работу. Вариант 5. Написать shell-процедуру, которая: • среди пользователей, работающих в данный момент времени в системе, находит пользователей, имена которых содержатся в файле, передаваемом в качестве первого параметра; • выводит на экран найденные имена пользователей; • тем пользователям, имена которых вводятся при исполнении процедуры, передает сообщение, текст которого содержится в файле (имя файла передается в качестве второго параметра). Вариант 6. Написать shell-процедуру, которая: • вводит символьную строку, содержащую имя некоторого каталога; • проверяет наличие каталога с таким именем в домашнем каталоге или в одном из подкаталогов домашнего каталога; • если такой каталог существует, то выводит на экран его содержимое, запрашивает необходимые права доступа для этого каталога и устанавливает заданные права доступа; • если каталог не существует, то создает его, запрашивает необходимые права доступа для вновь созданного каталога и устанавливает заданные права доступа. 145
Вариант 7. Написать shell-процедуру, которая: • в заданном первым параметром каталоге находит все простые файлы, в которых не содержится заданная вторым параметром символьная строка; • в найденных файлах ищет все повторяющиеся строки и удаляет все повторения строк; • выводит на экран содержимое всех найденных файлов. Вариант 8. Написать shell-процедуру, которая: • в заданном первым параметром каталоге находит все простые файлы, число ссылок на которые максимально, и удаляет их; • удаляет все пустые каталоги; • выдает на экран сообщения о каждом удаленном файле и каталоге. Вариант 9. Написать shell-процедуру, которая: • читает содержимое первого файла, передаваемого в качестве первого параметра; • читает содержимое второго файла, передаваемого в качестве второго параметра; • если число строк в первом и втором файлах одинаковое, то выводит на экран каждые 5 с попеременно строки из первого и второго файлов; • если число строк в первом и втором файлах разное, то выводит на экран каждые 5 с сначала строки первого файла, затем строки второго файла; • прекращает работу по окончании вывода всех строк первого и второго файлов. Вариант 10. Написать shell-процедуру, которая: • читает содержимое файла, передаваемого в качестве первого параметра (в файле в каждой строке представлено одно целое число); • проверяет правильность формата содержимого файла, при ошибках выводит соответствующие сообщения и завершает работу; • подсчитывает сумму всех содержащихся в файле чисел; • выводит на экран полученную сумму.
146
Вариант 11. Написать shell-процедуру, которая: • вводит символьную строку; • проверяет введенную строку на несовпадение со строкой, переданной в качестве первого параметра; • если строки не совпадают, то выдает на экран приглашение повторить ввод; • если строки совпадают, то сравнивает длину введенной строки с длиной второго параметра, и, в случае их равенства, выводит на экран введенную строку. Вариант 12. Написать shell-процедуру, которая: • вводит с терминала некоторое целое положительное число; • всем пользователям, работающим в данный момент в системе, посылает сообщение о числе порожденных ими процессов и допустимом числе, введенном с терминала; • тем пользователям, у которых число процессов больше введенного числа, посылает второе сообщение с предупреждением и выводит их имена на экран.
12. СЕТЕВЫЕ СРЕДСТВА UNIX С самого начала ОС UNIX разрабатывалась как операционная система, которая должна работать в компьютерной сети, т.е. как сетевая операционная система. В первых версиях проблема связи была решена с помощью утилит UUCP (UNIX to UNIX CoPy). Сети UUCP — это сети с коммутацией каналов, когда сначала устанавливалась связь между двумя конкретными компьютерами сети. Затем осуществлялся обмен файлами и электронной почтой, выполнялись команды в удаленном режиме. Связь сохранялась на все время сеанса совместной работы. Затем с помощью специальных команд эта связь разрывалась. Современные собственные сетевые средства ориентированы на сети Ethernet — сети с коммутацией пакетов. Данные передаются пакетами с заголовком, включающим адрес компьютера, на который передаются данные. В сетях этого типа все компьютеры имеют активную связь через линии связи постоянно (коаксиальные кабели, витая пара). В отличие от UUCP сеть этого типа позволяет со147
вместно использовать файловые системы и интерпретаторы командных строк одновременно на нескольких компьютерах. Для управления передачей пакетов используется единый протокол — IP (Internet Protocol), а каждый компьютер сети имеет собственный IP-адрес. Эти адреса присваиваются администратором сети и хранятся в файле /etc/.hosts/ каждого компьютера сети. Сети Ethernet де-факто стали стандартом для UNIX. Для конечных пользователей UNIX предоставляет ряд сервисов (специальных программ), дающих возможность пользователям работать на различных компьютерах сети. Сетевые средства позволяют: - копировапние файлов с одного компьютера на другой; - вход в другой компьютер для работы на нем; - выполнять командные строки на другом компьютере, а протокол выполнения команд анализировать на своем; - получить доступ к файлам другого компьютера без копирования на свой диск. Первыми из этих сервисов были разработаны сервисы telnet u ftp: telnet — сервис для входа в удаленный компьютер и использования всех его ресурсов; ftp — (протокол передачи файлов) сервис для обмена файлами с удаленным компьютером. По сути, сервисы — это некоторая надстройка над собственно UNIX или его расширение. Большинство ОС UNIX предоставляют широкий набор сетевых служб, который постоянно расширяется и совершенствуется. Идеи и принципы построения локальных вычислительных сетей, для которых изначально разрабатывался UNIX, привели к созданию глобальных сетей. Сетевые средства UNIX были быстро модернизированы для поддержки глобальных сетей. В них реализовано множество средств и услуг, объединенных общим названием Internet (INTERconnected NETworcs — "связанные сети"). В основе управления сетями лежат одни и те же принципы. В обоих случаях используется протокол IP (протоколы TCP, FTP, Gopher и др.). Ценность Internet состоит в том, что они не зависят ни от типа компьютеров, ни от их конфигурации, ни от способа физического соединения и пр. Обеспечивает инвариантность протокол TCP/IP. Этот протокол, по сути, вытеснил все остальные протоколы и тоже стал стандартом. Наиболее популярным приложением к Internet является одна из самых больших служб Internet — World Wide Web (WWW или Web). 148
12.1. СТЕК ПРОТОКОЛОВ TCP/IP Все современные версии ОС UNIX поддерживают стек протоколов TCP/IP, который является стандартом как для взаимодействия компьютеров в локальной сети, так в Internet. В основу стека положен протокол IP. Сервисом этого протокола пользуются транспортные протоколы: TCP (Transmission Control Protocol) – протокол надежной передачи данных, ориентированный на установление соединения, и UDP (User Datagram Protocol) – теоретически ненадежный протокол передачи данных без установления соединения. Прикладные протоколы, с которыми непосредственно работает сетевое приложение, используют либо протокол TCP, либо протокол UDP. В настоящее время существует множество прикладных протоколов, которые разработаны с учетом специфики конкретных сетевых приложений, использующих эти протоколы. Часто приложения называются так же, как и протокол: например, telnet-приложение использует в своей работе telnet-протокол, но www-приложение использует HTTP-протокол. Перечислим несколько протоколов прикладного уровня с их кратким описанием. На базе протокола TCP: Telnet (Terminal Networking) – протокол удаленного терминального доступа к командному интерпретатору, данный протокол позволяет организовать сетевой терминал, т.е. работать с командным интерпретатором другого компьютера; FTP (File Transfer Protocol) – протокол передачи файлов, позволяющий передавать файлы по сети от одного компьютера к другому; SMTP (Simple Mail Transfer Protocol) – протокол передачи электронной почты, позволяющий компьютерам обмениваться электронными письмами; HTTP (Hyper Text Transfer Protocol) – самый популярный протокол Internet, его используют www-приложения, например, при загрузке www-страницы браузером. На базе протокола UDP: DNS (Domain Name System) – протокол, обеспечивающий преобразование символьных имен компьютеров в их IP-адреса; TFTP (Trivial File Transfer Protocol) – простой протокол передачи файлов, используется в случае, когда применение протокола FTP слишком громоздко, например, при начальной загрузке бездисковых станций, когда необходимо передать по сети загрузочный образ, причем сделать это должна простая программа, целиком помещающаяся в ПЗУ. 149
12.2. ПРОТОКОЛ IP Рассмотрим теперь основные принципы сетевого взаимодействия при использовании протоколов стека TCP/IP. Базовым протоколом является протокол IP. На него возлагается функция маршрутизации пакетов. Именно этот протокол отвечает за то, чтобы информация, переданная с компьютера, находящегося в России, путем последовательных передач с компьютера на компьютер, в конце концов оказалась на компьютере в Австралии, для которого информация собственно и предназначалась. Сразу заметим, что протокол IP обеспечивает теоретически ненадежную передачу данных, так что может оказаться так, что информация будет потеряна. Но это не имеет значения, так как в стеке протоколов TCP/IP функции между протоколами строго разграничены, и за надежную доставку данных будет отвечать протокол TCP, который будет рассмотрен ниже. Протокол IP всю передаваемую информацию от протоколов более высокого уровня разбивает на порции определенного размера, снабжает каждую порцию IP-заголовком, содержащим кроме всего прочего IP-адрес отправителя и IP-адрес получателя. Сформированный таким образом IP-пакет отправляется в сеть. Каждый промежуточный компьютер (сетевой узел, маршрутизатор) анализирует информацию, содержащуюся в заголовке, и определяет: какому следующему узлу необходимо его передать. Этот процесс как раз и называется маршрутизацией (определение, какому следующему узлу передать пакет). Таким образом, пакет, сформированный на компьютере-отправителе, в неизменном виде (за исключением некоторых полей IP-заголовка) будет доставлен компьютеруполучателю (или будет потерян), на котором исходная информация будет собрана и передана протоколу более высокого уровня (TCP или UDP). Для идентификации компьютеров в IP-сетях используется IPадрес, причем для сети Internet IP-адрес должен быть уникален в пределах всей сети, чтобы для пакета, содержащего в своем заголовке IP-адрес получателя, был однозначно определен компьютерполучатель. IP-адрес представляет собой четырехбайтовое (32разрядное) число, все байты которого записаны в десятичном виде и разделены точкой, например: 194.67.67.33. В терминах протокола IP каждый компьютер, подключенный к сети, называется host150
компьютером или host. Поэтому часто говорят об IP-адресе host. Поскольку человек лучше запоминает имена, чем числа, то еще используется DNS — доменная система имен, о которой будет рассказано далее. 12.3. ПРОТОКОЛ TCP Рассмотрим теперь протокол TCP. Как уже говорилось, этот протокол обеспечивает надежную передачу данных с установлением соединения. Каким же образом этот протокол, пользуясь сервисом ненадежного протокола IP для доставки своих сообщений, в то же время обеспечивает надежную связь? Не претендуя на подробное изложение спецификации протокола, поясним кратко суть, позволяющую понять этот парадокс. Протокол TCP обеспечивает установление соединения между двумя приложениями, работающими на разных компьютерах (можно и на одном). Поскольку на одном компьютере с многопроцессной OC UNIX может одновременно работать несколько приложений, то для идентификации соединения недостаточно только IP-адресов компьютеров. Каждое соединение идентифицируется четырьмя значениями: IP-адресами компьютеров и номерами портов приложений. Поэтому между двумя компьютерами может быть организовано несколько соединений, они будут различаться номерами портов. Порт – целое число, под хранение которого выделяется два байта, т.е. максимальное значение номера порта 65535. Известные приложения, использующие стандартные протоколы, имеют стандартный номер порта. Например, www-приложения используют номер 80. Два приложения в TCP-соединении не равноценны. Одно приложение (сервер) пассивно ждет запроса на установление соединения, другое приложение (клиент) активно посылает такой запрос. Таким образом, две стороны в соединении носят название сервер (пассивная сторона) и клиент (активная сторона), говорят о клиентсерверной архитектуре сетевых приложений. Установление соединения происходит путем "тройного рукопожатия": последовательного обмена тремя пакетами. Запрос, подтверждение возможности соединения, подтверждение получения подтверждения, т.е. клиент посылает два пакета, а сервер один. Далее стороны обмениваются пакетами, причем каждый пакет содержит информацию прежде 151
всего о том, к какому соединению он относится (четыре идентификатора), а также порядковый номер пакета (на самом деле все гораздо сложнее, но для понимания сути этого достаточно). Каждая сторона нумерует посылаемые пакеты. При получении пакета каждая сторона посылает подтверждение (квитанцию). Обычно квитанцию помещают в пакет с передаваемыми данными, т.е. специально квитанцию не посылают, а при посылке очередного пакета с помощью специального флага указывают, что этот пакет одновременно является квитанцией на полученные ранее данные. Так как протокол TCP пользуется ненадежным сервисом IPпротокола, то пакет или квитанция могут быть потеряны. Каждая сторона при посылке каждого пакета запускает таймер, который сбрасывается при получении квитанции. Если время таймера истекло, а квитанция не была получена, то сторона повторно посылает предположительно потерянный пакет и заново запускает таймер. После определенного числа попыток соединение считается разорванным, т.е. протокол TCP констатирует, что в данных условиях надежная связь невозможна. Таким образом, возможно установление надежного соединения при использовании ненадежных сервисов низкого уровня. 12.4. ПРОТОКОЛ UDP Протокол UDP более простой. Установление соединения не происходит. Приложения могут просто обмениваться пакетами. По сути, протокол UDP представляет собой удобный интерфейс доступа к IP-протоколу. Он снабжает пакеты UDP-заголовками, содержащими номера портов отправителя и получателя, позволяющие идентифицировать приложение, тогда как IP-протокол в чистом виде позволяет идентифицировать только компьютер. Протокол UDP ненадежный, поэтому приложение должно обеспечивать свои собственные средства, гарантирующие доставку пакетов. Например, приложение может запускать таймер и повторно отправлять недоставленные сообщения. UDP-протокол часто используют приложения, обслуживающие одиночные короткие запросы, так как в этом случае, не получив ответ, приложение может просто повторить еще раз запрос. Например, запрос доменного имени в DNS. 152
Рассмотрим теперь доменную систему имен DNS. Как уже было отмечено, каждый компьютер в сети имеет уникальный IP-адрес, но человек плохо запоминает числовые идентификаторы, гораздо лучше символьные имена. Поэтому каждому компьютеру можно присвоить имя и вместо IP-адреса указывать его имя. Первоначально так и было. Компьютерные сети были маленькие, и каждому компьютеру не представляло труда присвоить уникальное имя. Список соответствий имен и адресов хранился на каждом компьютере в файле /etc/hosts. Но даже уже тогда возникала проблема: при подключении к сети нового компьютера было необходимо обновить содержимое файла /etc/hosts на каждом компьютере, подключенном к данной сети, т.е. необходима централизованная система, обеспечивающая преобразование символьных имен в адреса. С другой стороны, когда количество компьютеров превышает даже сотню, уже трудно обеспечить уникальность имени. В доменной системе имен имя компьютера имеет следующую структуру: name3.name2.name1, где частей namen может быть несколько. Каждая часть носит название домена, причем нумерация доменов производится справа налево, т.е. name1 – домен первого уровня, например, www.dozen.mephi.ru, здесь ru – домен первого уровня, mephi – домен второго уровня, dozen – домен третьего уровня, a www.dozen.mephi.ru целиком – доменное имя. Доменная система имен обеспечивает преобразование доменного имени в IP-адрес. DNS также обеспечивает множество других полезных функций, в частности, обратное преобразование IP-адрес – доменное имя. Доменная система имен – распределенная по всему миру постоянная обновляемая база данных, где за каждым DNS-сервером четко закреплена зона ответственности. В терминологии DNS – зона ответственности так и называется зона, а сервер, отвечающий за эту зону, называется авторитетным сервером. На администратора авторитетного сервера возлагается обязанность следить за уникальностью имени в пределах зоны. Вопросы для самоконтроля 1. Перечислите основные особенности протоколов IP, TCP и UDP. 2. Для чего предназначена доменная система имен? 3. Какой протокол необходимо использовать для пересылки файлов между компьютерами? 153
13. ИНСТАЛЛЯЦИЯ. ОСНОВНЫЕ ПРАКТИЧЕСКИЕ ПРИЁМЫ 13.1. УСТАНОВКА ОС UNIX Рассмотрим процесс установки ОС UNIX. В качестве примера будем использовать Slackware Linux. Это один из самых первых дистрибутивов Linux. Версия не имеет значения, так как основные этапы установки во всех версиях стандартны. Прежде всего, необходимо получить дистрибутив ОС. Существует множество wwwсайтов, где можно получить указанный дистрибутив. Например, www.slackware.com. Пользуясь средствами FTP, последнюю версию дистрибутива Slackware можно получить по адресу: ftp://ftp.slackware.com/pub/slackware. Особенностью данного дистрибутива является то, что он поддерживает максимально возможное количество аппаратных конфигураций, что понижает вероятность неудачи при установке на произвольную конфигурацию компьютера. Вообще, UNIX-подобные ОС обычно не критичны к ресурсам и требуют минимальной конфигурации. Тем более, мы собираемся работать в командной строке, а обычно половину объема жесткого диска в установленной системе занимают графические средства. ОС Linux может работать даже на процессорах 80386. Итак, нам достаточно 32 Мбайт оперативной памяти (конечно, чем больше, тем лучше: система будет работать гораздо быстрее) и 500 Мбайт свободного пространства жесткого диска. На компьютере может быть установлена другая ОС, например WINDOWS, тогда надобность во вспомогательном компьютере отпадает. 13.2. СОЗДАНИЕ ДИСТРИБУТИВНОГО ДИСКА Здесь нам понадобится компьютер c установленным MSDOS или WINDOWS. Конечно, и эту стадию можно выполнить в установленной UNIX-системе, но поскольку мы рассчитываем на неподготовленного пользователя UNIX, который устанавливает первую в своей жизни систему, то предполагаем, что ему недоступен компьютер с уже установленной версией UNIX, а WINDOWS или, на худой конец, MSDOS можно всегда найти. Если дистрибутив представлен набором CD, то эту стадию можно пропустить. Мы не приводим пример установки с загрузочных дискет, так как во всех 154
современных компьютерах есть возможность загрузки с CD-ROM. Для этого необходимо наличие CD-ROM и не очень старой версии BIOS. Если нет набора дистрибутивных CD, то его необходимо создать при помощи любой стандартной программы записи. Образы CD (4 файла, так как дистрибутив состоит из 4 CD) обычно помещаются в параллельный с основным дистрибутивом каталог и имеют расширение .iso. Другие файлы в этом каталоге содержат контрольную информацию, позволяющую проверить корректность полученных файлов с образами. Также при помощи контрольных файлов можно проверить на корректность уже созданные CD. При первом знакомстве стадию проверки можно пропустить, надеясь, что дистрибутивные CD были записаны корректно. В рамках данной книги мы не рассматриваем установку с дистрибутивных дискет, так как у пользователя всегда есть возможность получить более новую версию дистрибутива, поддерживающую установку с CD-ROM. С другой стороны, установка с дискет более сложна и не подходит для пользователя, впервые устанавливающего такую сложную ОС, каковой является UNIX. 13.3. ПОДГОТОВКА ЖЕСТКОГО ДИСКА Информация, записанная на жесткий диск, обычно структурирована следующим образом: в начале дискового пространства имеется главная загрузочная запись MBR, которая в своем составе содержит таблицу разделов. В этой таблице может содержаться информация не более чем о четырех разделах, которые носят название основных разделов. Запись о каждом разделе содержит среди прочего начальный адрес раздела, его размер, тип раздела и т.п. Каждый раздел может начинаться со своей загрузочной записи. Операционные системы DOS и WINDOWS позволяют создать только два раздела. Первый соответствует диску С:, а второй – расширенный раздел, в котором можно создавать логические диски D:, Е: и т.д. Для установки UNIX необходимо иметь две свободных записи в таблице разделов. Поскольку DOS и WINDOWS используют только две записи, то возможно мирное сосуществование двух ОС на одном компьютере. Возможны два варианта: первый – установка UNIX на чистый жесткий диск либо на новый компьютер, либо на 155
компьютер с двумя жесткими дисками, на одном из которых установлена другая ОС; второй вариант – на тот же самый жесткий диск, где установлена другая ОС. Конец текущего пункта можно пропустить, если нет необходимости использовать один жесткий диск для двух ОС. Если необходимо использовать жесткий диск, на котором уже установлена другая ОС, то необходимо выделить на нем свободное пространство, которое не будет принадлежать ни одному из двух разделов, используемых DOS или WINDOWS. Перед любыми операциями с таблицей разделов необходимо позаботиться о сохранении информации. Эти операции относятся к разряду самых опасных и могут привести к полной потере информации на жестком диске. Итак, нам необходимо, по крайней мере, 500 Мбайт свободного пространства. Прежде всего необходимо убедиться в наличии этого пространства, так как использовать сжатие данных в этом случае нельзя. Необходима неиспользуемая область на каком-либо логическом диске. Например, диск Е: имеет размер 1 Гбайт, а содержит всего три файла, суммарный размер которых составляет 5 Мбайт. Лучше всего выделение этого пространства произвести с помощью удобных графических WINDOWS-программ, позволяющих менять размеры разделов без потери информации. (Все равно перед такой операцией необходимо создать резервные копии важных файлов на другом жестком диске или компьютере по сети.) Можно вручную сохранить информацию, содержащуюся на всех логических дисках расширенного раздела (диски D:, Е: и т.д.), например на другом компьютере по сети. Далее с помощью программы fdisk удалить расширенный раздел и создать новый меньшего размера, после чего в нем создать все логические диски. Выполнить обратное копирование сохраненных файлов. Существует вероятность, что после такой операции все файлы могут не поместиться на новых логических дисках меньшего объема. Лучше такие операции проводить под присмотром опытного пользователя или использовать новый диск для установки UNIX.
156
13.4. ЗАГРУЗКА С УСТАНОВОЧНОГО ДИСКА Итак, место найдено или мы используем новый диск для установки UNIX. Устанавливаем в BIOS первым приоритетом загрузку с CD-ROM и перезагружаем компьютер, поместив в CD-ROM CD с дистрибутивом Slackware Linux. В ответ на приглашение загрузчика boot: можно просто нажать клавишу Enter. По умолчанию будет загружать ядро bare.i. Это ядро поддерживает большинство стандартного оборудования. Если загрузка не удалась, то можно повторно провести загрузку, указав после приглашения boot: необходимое ядро. Описание различных ядер и поддерживаемого ими оборудования всегда легко прочитать в электронной документации на дистрибутивных CD. В частности, при наличии USBконтроллера (например, клавиатура подключена по USB) необходимо использовать ядро usb.i. Ядро должно поддерживать только то оборудование, которое необходимо в процессе установки. В дальнейшем пользователь сможет собрать ядро, наиболее точно соответствующее используемому оборудованию. После приобретения необходимо опыта, когда пользователь будет себя чувствовать более уверенно, можно и даже нужно собрать новое ядро, хотя бы для того, чтобы исключить из него неиспользуемые компоненты, тем самым уменьшить его размер и увеличить быстродействие. После загрузки инсталляционного ядра система находится в однопользовательском привилегированном режиме и на экране появляется приглашение командной оболочки #. 13.5. СОЗДАНИЕ ДИСКОВЫХ РАЗДЕЛОВ Для создания дисковых разделов (изменения и удаления существующих) используется команда fdisk. В качестве параметра ей необходимо передать имя специального файла устройства, соответствующего жесткому диску, на котором необходимо корректировать таблицу разделов. Например, /dev/hda – первый диск, подключенный к первому IDE-контроллеру (обычно жесткий диск), /dev/hdb – второй диск, подключенный к первому IDEконтроллеру, /dev/hdc – первый диск, подключенный ко второму IDE-контроллеру (чаще всего это CD-ROM) и т.п. Все имена специальных файлов устройств, подключенный посредством IDE157
контроллера будут иметь префикс hd. Аналогично файлы устройств SCSI-контроллера будут иметь префикс sd. Предположим, что планируется установить UNIX на IDE-диск. Если используются другие типы контроллеров, то всю необходимую информацию можно получить в электронной документации на дистрибутивных CD. Для редактирования таблицы разделов первого жесткого диска, подключенного к первому IDE-контроллеру, необходимо ввести команду: fdisk /dev/hda. Еще раз предупреждаем, что если на этом диске уже есть другая ОС, то подобные манипуляции лучше проводить под присмотром опытного пользователя, сохранив при этом важные данные на другом диске/компьютере. Команда fdisk выводит приглашение: Command (m for help): По команде m всегда можно получить список подкоманд команды fdisk. Первое, что нужно всегда сделать при работе с командой fdsik, это распечатать существующую таблицу разделов при помощи подкоманды p. Рекомендуется это сделать, даже если используется новый диск, чтобы убедиться в отсутствии разделов. На диске с установленной ОС это необходимо, чтобы еще раз убедиться в наличии свободного дискового пространства. Теперь определимся с объемами разделов. Нам необходим основной раздел и раздел свопинга. Под раздел свопинга обычно отводят пространство, равное удвоенному объему оперативной памяти. Например, если объем ОП равен 128 Мбайт, то под раздел свопинга целесообразно выделить 256 Мбайт. При этом не следует забывать, что хотя бы 450 Мбайт должно остаться под основной раздел. Надеемся, что используется разумное соотношение объема ОП и жесткого диска, т.е. если объем ОП равен 128 Мбайт, то на жестком диске планируется выделить как минимум 1 Гбайт. Отметим, что опытные пользователи UNIX обычно выделяют более двух разделов, например, каталог /home, содержащий головные каталоги пользователей, занимает обычно отдельный раздел. Но мы для первого знакомства будем использовать только два раздела: корневой раздел (в нем будут размещены все традиционные каталоги UNIX: /usr, /home, /var и т.п.) и раздел свопинга. Для создания раздела необходимо использовать подкоманду n. После чего указать, что мы создаем основной раздел, набрав подкоманду p. Далее необходимо указать номер создаваемого раздела. Так как возможно всего четыре основных раздела, то номер следу158
ет указать из диапазона 1 – 4. Если используется новый диск, то номера разделов будут 1 и 2. Первый раздел корневой, раздел номер 2 для свопинга. Если на диске уже имеются разделы, используемые другой ОС, то следует использовать номера 3 и 4. Программа fdisk выдаст предупреждающее сообщение при попытке присвоить создаваемому разделу номер уже существующего раздела. При создании раздела необходимо указать начальный и конечный цилиндры раздела. Причем система покажет рекомендуемый номер начального цилиндра (первый свободный цилиндр), с которым можно согласиться. Рекомендуемый номер конечного цилиндра – это всегда последний цилиндр. Поэтому, чтобы не осталось неиспользуемого пространства на диске, можно с этим номером согласиться при создании последнего раздела. (Раздела свопинга.) При создании корневого раздела вместо указания конечного номера цилиндра можно указать размер раздела, что гораздо удобнее. Для этого перед числом необходимо указать знак +, а после числа единицу измерения: М – мегабайт, Г – гигабайт. Система автоматически рассчитает номер конечного цилиндра. Поскольку раздел всегда должен занимать целое число цилиндров, то это значение будет округлено в большую сторону до конца очередного цилиндра. После создания разделов они автоматически создаются с типом 83 – раздел Linux. Нам же для второго раздела нужно задать другой тип 82 – раздел свопинга. Для этого следует использовать подкоманду t. После модификации таблицы разделов необходимо осуществить сохранение новой таблицы разделов при помощи подкоманды w. Дело в том, что до сохранения модификация информации производится только в оперативной памяти, и всегда есть возможность выхода без сохранения при помощи подкоманды q. Поэтому если возникли какие-либо сомнения, особенно в случае модификации существующих разделов, то следует выйти из программы fdisk без сохранения изменений, а потом повторно запустить ее. После модификации таблицы разделов следует обязательно перезагрузить систему: # reboot Рассмотрим пример создания разделов для нового диска. Предположим, что объем жесткого диска составляет 1 Гбайт=1024 Мбайт, а объем ОП – 64 Мбайт. В этом случае можно для корневого раздела выделить 896 Мбайт, а для свопинга — 128 Мбайт: # fdisk /dev/hda 159
Command (m for help): p Disk /dev/hda: 255 heads, 63 sectors, 131 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System Убедились, что на диске нет разделов, можно продолжать работу: Command (m for help): n Command action e extended p primary partition (1-4): p Partition number (1-4): 1 First cylinder (1-131): 1 Last cylinder or +size or +sizeM or +sizeK (1131): +896M Command (m for help): n Command action e extended p primary partition (1-4): p Partition number (1-4): 2 First cylinder (116-131): 116 Last cylinder or +size or +sizeM or +sizeK (116-131): 131 Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 82 Command (m for help): p Disk /dev/hda: 255 heads, 63 sectors, 131 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Start End Blocks Id System /dev/hda1 1 115 923736+ 83 Linux /dev/hda2 116 131 128520 82 Linux swap Command (m for help): w Command (m for help): q 160
Заметим, что для второго раздела пришлось вручную задать его тип 82 – раздел свопинга. Обратим внимание, что система автоматически округлила размер раздел до границы ближайшего цилиндра, т.е. размер первого раздела — 115 цилиндров, что несколько больше, чем 896 Мбайт. Знак + после размера первого раздела в блоках означает, что в первом разделе не используется первая дорожка, в первом секторе которой как раз и расположена главная загрузочная запись MBR. Подробнее о разбиении диска на разделы можно прочитать в электронной документации, содержащейся в дистрибутиве. 13.6. ПРОЦЕДУРА УСТАНОВКИ После перезагрузки системы необходимо убедиться при помощи команды fdisk с опцией –l, что все необходимые разделы созданы. В противном случае следует повторить предыдущий шаг, поскольку после того как система будет установлена, модификация разделов сопряжена со значительным трудностями даже для подготовленных пользователей. Если на жестком диске созданы все необходимые разделы, то можно запустить собственно программу установки setup: # setup На экране появится псевдографическое меню, в котором необходимо последовательно выбрать все пункты KEYMAP, ADDSWAP, TARGET, SOURCE, SELECT, INSTALL, CONFIGURE. Настройка клавиатуры Пункт меню KEYMAP. Здесь необходимо выбрать раскладку клавиатуры. Если не предполагается работа с кириллицей, то можно оставить установку по умолчанию: us.map – американская раскладка клавиатуры. Нам следует выбрать: ru1.map – русская раскладка koi8-r, переключение алфавита русский/английский – правая клавиша Alt. Инициализация свопинга Пункт меню ADDSWAP. Здесь необходимо задать раздел свопинга. Предположим, что раздел свопинга имеет номер два, тогда следует указать /dev/hda2, аналогично, если установка производит161
ся на жесткий диск, с уже установленной другой ОС, то раздел номер четыре – /dev/hda4. Обычно система сама распознает раздел свопинга, если он один, – необходимо только подтвердить значение, предлагаемое системой. Создание файловых систем Пункт меню TARGET. Как уже говорилось, мы будем устанавливать систему в один корневой раздел. Поэтому следует выбрать созданный нами корневой раздел – /dev/hda1. Далее система предложит отформатировать раздел и создать на нем файловую систему. Необходимо выбрать тип файловой системы ext2 и значения всех параметров по умолчанию, а также проверку на ошибки форматирования (Check) После этого необходимо подождать. Время ожидания прямо пропорционально размеру корневого раздела – производится создание и проверка файловой системы. Выбор среды установки Пункт меню SOURCE. Здесь необходимо выбрать установку с CD-ROM. Обычно система автоматически находит устройство, необходимо только подтвердить выбор. Если возникли проблемы, то их лучше устранить с привлечением помощи более опытного пользователя. Некоторые проблемы решаются просто путем ручного выбора устройства, содержащего CD-ROM, но бывают случаи, что тип оборудования не поддерживается ядром, тогда необходим выбор другого ядра установки и повторения всех пройденных ранее шагов. Выбор устанавливаемых пакетов Пункт меню SELECT. Мы устанавливаем систему в минимальной конфигурации. Работа будет производиться в командной строке. Ранее отмеченные требования к размеру жесткого диска справедливы только для данного типа установки. Если будет проводиться установка большего числа пакетов, то, возможно, понадобится больший объем памяти жесткого диска. Например, максимальный вариант установки может потребовать до 3ГБ свободного места. В этом пункте меню необходимо пометить знаком Х устанавливаемые наборы пакетов. Перечислим необходимый для нашей работы минимум: 162
A – базовая система (обязательный набор пакетов); AP – базовые приложения Linux; D – среды разработки (можно не устанавливать, если не предполагается программирование, например на языке С); F – документация (с помощью нее можно получить много полезной информации); K – исходные коды ядра (используется, если планируется сборка ядра, учитывающая особенности конфигурации конкретного компьютера); N – сетевые средства. Вообще система будет работать и при установке только первой группы пакетов, но возможности такой системы будут весьма ограничены. Собственно установка Пункт меню INSTALL. Здесь необходимо выбрать пункт меню full, определяющий установку всех пакетов в выбранных наборах. На этой стадии происходит копирование информации со среды установки (CD) в корневой раздел жесткого диска, поэтому этот процесс может занять продолжительное время. Конфигурирование системы Пункт меню CONFIGURE. Здесь необходимо пройти через несколько последовательных подменю для установки некоторых основных параметров. Установка ядра. Необходимо выбрать пункт меню skip – будет использоваться стандартное ядро. Создание загрузочной дискеты можно пропустить. Загрузочная дискета необходима в случае, если не удается загрузить систему обычным образом. Мы в этом случае можем пользоваться загрузочным CD, так как он содержит то же самое ядро. Впоследствии когда мы соберем ядро, учитывающее конфигурацию конкретного компьютера, целесообразно будет создать загрузочную дискету, содержащую собранное нами ядро. Конфигурирование модема мы пропускаем. Далее можно задать автоматическое монтирование CD-ROM. Шрифт мы выбираем кириллический. Можно оставить шрифт по умолчанию, если не планируется работа с кириллицей.
163
Настройка загрузчика Настройка LILO. LILO (LInux LOader) – начальный загрузчик ОС. Поясним кратко его функциональное назначение. Когда осуществляется включение компьютера, то BIOS в соответствии со своими внутренними настройками определяет устройство начальной загрузки. Это может быть гибкий диск, жесткий диск, CDROM, возможна загрузка по сети. Если в качестве этого устройства установлен жесткий диск, то BIOS считывает с него главную загрузочную запись MBR (Master Boot Record), содержащую код начальной загрузки системы, и передает ей управление. Дальнейшая загрузка системы полностью определяется кодом начальной загрузки. LILO – достаточно сложный загрузчик и первую часть своей программы он помещает в главную загрузочную запись. Далее производится считывание и выполнение остальных частей программы, после чего считывается, распаковывается (ядро Linux на жестком диске для экономии места хранится в сжатом виде) и запускается ядро. Это очень сложный процесс, выходящий за рамки данной книги. Начальный загрузчик мы будем устанавливать в MBR, выбрав соответствующий пункт меню. Далее система автоматически обнаружит все разделы жесткого диска и настроит LILO таким образом, что при загрузке можно будет выбрать, какую ОС загружать. Если установка производилась на новый жесткий диск, то, естественно, никакой альтернативы нет и загрузка возможна только ОС Linux. Впоследствии, освоив систему, можно будет создать нестандартное меню начальной загрузки, например, защитить начальную загрузку с параметрами ядра паролем: в этом случае обычную загрузку сможет произвести любой пользователь, просто нажав Enter, а при загрузке в однопользовательском привилегированном режиме потребуется указать пароль. Настройка сети Если не планируется работа с сетью, то этот пункт можно пропустить. Но лучше все равно задать петлевое устройство loopback, так как многие программы при работе даже в несетевом режиме все равно используют этот сетевой интерфейс. Если же планируется работа с реальной сетью, то нужно уточнить у сетевого администратора следующие параметры и аккуратно их задать: короткое имя 164
компьютера, имя домена, IP-адрес, сетевую маску, IP-адрес шлюза и IP-адрес DNS сервера. В дальнейшем эти параметры можно легко поменять без ущерба для остальных конфигурационных параметров. Обычно сетевой адаптер компьютера распознается инсталляционным ядром по умолчанию. Если же установлен нестандартный сетевой адаптер, то может понадобиться осуществить сборку нового ядра, содержащего драйвер используемого сетевого адаптера. Настройка мыши и системных часов Далее необходимо настроить конфигурацию мыши и установить часовой пояс. При установке часового пояса следует иметь в виду следующее: ОС UNIX хранит время по Гринвичу (GMT). В этом случае нет необходимости перехода на летнее время. Функции, работающие со временем, автоматически определяют время года и вносят необходимую поправку. Например, для Москвы зимой +3, а летом +4 по сравнению с GMT. Следует всегда выбирать этот вариант, если UNIX – единственная ОС на компьютере. Но если на компьютере установлена еще и другая ОС, которая тоже пользуется часами BIOS, то этот вариант не подходит. Например, WINDOWS хранит локальное время и два раза в год осуществляет перевод часов. В этом случае следует выбрать локальное время, а за перевод часов будет отвечать WINDOWS. Выбор графической системы мы пропускаем, так как будем работать в режиме командной строки. Установка пароля системного администратора Для установки пароля системного администратора необходимо два раза ввести пароль системного администратора (пользователя root). Вводимые символы в целях безопасности отображаться не будут. Значение этого пользователя нам должно быть известно из других разделов этой книги. После перезагрузки работать в системе можно будет, только предварительно зарегистрировавшись, указав логическое имя и пароль. В случае утери пароля пользователя root единственный выход – переустановка системы. Поэтому как бережно необходимо хранить пароль системного администратора, так и избегать попадания этого пароля в чужие руки. Всякий, получивший пароль системного администратора, получает неограниченную власть над ОС. 165
Не рекомендуется постоянно работать под логическим именем root. Так как этот пользователь обладает неограниченными правами в системе, то можно по ошибке нанести вред ОС. Необходимо создать обычных пользователей и работать под этими регистрационными именами. Регистрироваться под именем root нужно только для выполнения каких-либо административных действий, требующих дополнительных прав. Создание пользователей осуществляется при помощи команды useradd. Создать пользователя можно, зарегистрировавшись в системе в качестве системного администратора, используя логическое имя root. Первая загрузка и работа во вновь установленной системе Теперь необходимо выйти из графической оболочки при помощи пункта меню EXIT: удалить из CD-ROM дистрибутивный диск и попытаться перезагрузиться. В этом случае должна произойти первая загрузка вновь установленной системы: # reboot После чего можно зарегистрироваться и начать работу во вновь установленной системе. Первое, что рекомендуется сделать – это создать непривилегированных пользователей для повседневной работы: # useradd user При этом будет создан непривилегированный пользователь с логическим именем user. Можно указать любое другое имя, состоящее не более чем из восьми латинских букв. Далее следует задать пароль новому пользователю: # passwd user При выполнении этой команды необходимо два раза ввести пароль. Символы при вводе отображаться не будут. Система может попросить ввести другой пароль, если данный пароль покажется системе слабым (слишком короткий, содержит словарное слово или содержит все символы в одном регистре). Сильный пароль должен быть не менее восьми символов длиной, содержать как буквы, причем в верхнем и нижнем регистрах, так и цифры, не быть основанным на словарном слове. Далее нужно обязательно выйти из системы и зарегистрироваться в ней в качестве обычного непривилегированного пользователя. Работать с правами системного администратора рекомендуется только в случае крайней необходимости. Например, для создания 166
новых пользователей, подключения новых дисков, установки нового системного программного обеспечения. Во всех остальных случаях любое случайное ошибочное действие с правами системного администратора может привести к непоправимым ошибкам: потере важных системных файлов и даже к порче аппаратных средств. Если необходимо выполнить действие, требующее прав системного администратора, то необязательно регистрироваться в системе как root. Можно временно получит права системного администратора при помощи команды su. В ответ система попросит ввести пароль системного администратора, и текущий пользователь временно получит привилегии системного администратора. После выполнения всех необходимых действий по команде exit можно вернуться к работе с правами обычного пользователя. Вопросы для самоконтроля 1. Перечислите основные стадии установки ОС UNIX. 2. Что представляет собой и каким образом можно получить дистрибутив системы? 3. Для чего служит таблица разделов жесткого диска? 4. В каких случаях может потребоваться процедура сборки нового ядра? 5. Как осуществляется выбор набора устанавливаемых пакетов? 6. Что представляет собой начальный загрузчик системы? 7. В каком случае необходимо регистрироваться под именем привилегированного пользователя root?
167
14. ТЕСТ ДЛЯ ИТОГОВОЙ ПРОВЕРКИ ПОЛНОТЫ УСВОЕНИЯ УЧЕБНОГО МАТЕРИАЛА Вопрос 1. Какую роль играют стандарты при разработке исходных кодов операционных систем семейства UNIX: а) формируют написание инструкций конечного пользователя; б) стандартизуют интерфейсы и функции программных модулей ОС; в) ориентируют на стандартную конфигурацию аппаратных платформ? Вопрос 2. Утилиты являются: а) интерпретаторами кодов внутренних команд; б) исполнимыми файлами внешних команд; в) исполнимыми файлами внутренних команд; г) интерпретаторами кодов внешних команд. Вопрос 3. Что такое среда работы пользователя? а) набор системных глобальных переменных; б) информационная структура для хранения контекстов процессов; в) интерпретатор командных строк. Вопрос 4. Назначение оболочки (shell): а) интерпретация командных строк; б) выполнение утилит и внутренних команд; в) планирование и управление очередью процессов; г) формирование значений глобальных переменных среды; д) генерация имен файлов; е) подстановка результатов выполнения команд; ж) управление устройствами в процессе исполнения задач; з) защита ядра ОС от несанкционированного воздействия по каналам связи. Вопрос 5. Какая из указанных последовательностей имен файлов является верной при подготовке программы prog к счету: а) a.out -> prog.c -> prog.a -> prog.o; б) a.out-> prog.a -> prog.o -> prog.c; 168
в) prog.a -> prog.c -> prog.o -> a.out; г) prog.c -> prog.o -> prog.a -> a.out; д) prog.c -> a.out -> prog.a -> prog.o? Вопрос 6. Какую промежуточную форму программы в оперативной памяти строит программа-загрузчик ОС: а) prog.o б) prog.a в) a.out г) исполняемый код программы; д) prog.c? Вопрос 7. Какие имена файлов будут сгенерированы оболочкой при использовании в командах шаблона [1-3]*.asm? а) только имена, начинающиеся с символов 1, или 2, или 3 и заканчивающиеся последовательностью символов .asm; б) имена файлов ассемблерных программ; в) все имена, включающие наборы символов .asm и порядковые номера 1 и 3. Вопрос 8. Что будет на экране после выполнения протокола $ ls $ touch abc $ touch a.bc $ touch c.abcd $ ls ?bc*? а) abc; б) a.bc; в) c.abcd; г) abc. Вопрос 9. Какого типа файлы используются в команде $ cp a b c d e? а) a, b, c, d – обычные файлы, e – каталог; б) a – каталог, b, c, d, e – обычные файлы; в) все обычные файлы.
169
Вопрос 10. Что будет результатом работы команды $ ln a b c? а) содержимое файлов a и b будет слито в файл c текущего каталога; б) в текущем каталоге создаются ссылки на файлы a, b, c; в) в каталоге c будут созданы ссылки на файлы a и b текущего каталога. Вопрос 11. Что будет результатом работы команды над обычными файлами a и b: $ ln a b …? а) файлы a и b текущего каталога копируются в вышележащий каталог с совпадающими именами; б) в вышележащем каталоге создается ссылка на файл a с новым именем b; в) в вышележащем каталоге создаются ссылки на файлы a и b текущего каталога с совпадающими именами. Вопрос 12. Что будет результатом работы команды над обычными файлами $ ln d/a b? а) в подкаталоге b создается ссылка с совпадающем именем на файл a из подкаталога d; б) в текущем каталоге создаются две ссылки: на файл a из подкаталога d и файл b из текущего каталога; в) в текущем каталоге создается ссылка с именем b на файл a из подкаталога d. Вопрос 13. Какие из указанных ниже команд корректны и будут выполнены? а) $ find . -name ’*.txt’; б) $ find . –type f ( –size 200c –o –size 100c ); в) $ find –type f \( –size 200c –o –size 100c \); г) $ find * -name *.txt.
170
Вопрос 14. Где будет осуществляться поиск файлов, отвечающих заданным условиям в команде find . -type f –user lev? а) во всей системе каталогов, начиная HOME-каталога пользователя; б) в системе подкаталогов, начиная с текущего; в) во всей системе каталогов, начиная с корневого. Вопрос 15. Что будет являться результатом после выполнения команды find . -name ’*.asm’ –exec cat {} \;? а) все найденные файлы будут слиты в один, который и будет выведен на экран; б) все найденные файлы будут скопированы в текущий каталог; в) все найденные файлы *.asm будут последовательно выведены на экран. Вопрос 16. Что будет результатом командной строки $ find * \( -type f –name ’*.txt’ \) –o \( -type f –name ’*.doc’ \)? а) вывод на экран маршрутных имен файлов только с именами *.txt; б) вывод на экран маршрутных имен файлов только с именами *.doc; в) вывод на экран маршрутных имен файлов с именами *.txt или *.doc; г) вывод на экран маршрутных имен обычных файлов. Вопрос 17. Где будет осуществляться поиск файлов, отвечающих заданным условиям в команде find -type f –user lev? а) во всей системе каталогов, начиная HOME-каталога пользователя; б) в системе подкаталогов, начиная с текущего; в) во всей системе каталогов, начиная с корневого. Вопрос 18. Выполнение каких из предлагаемых команд предоставляет право выполнения программы prog2 строго только владельцу файла: а) $ chmod a=rx prog2; 171
б) $ chmod u=rwx prog2; в) $ chmod 0133 prog2; г) $ chmod u=rx,go-rx prog2; д) $ chmod 0733 prog2; е) $ chmod a-x,u+x prog2? Вопрос 19. После выполнения каких команд файл f2 текущего каталога может быть защищен от удаления и модификации: а) $ chmod =w . $ chmod 0222 f2; б) $ chmod 0555 . $ chmod 0444 f2; в) $ chmod 0222 . $ chmod 0222 f2; г) $ chmod =r . $ chmod =w f2? Вопрос 20. При выполнении каких вариантов протокола подкаталог d1 текущего каталога можно сделать текущим: а) $ chmod 0444 . $ chmod 0444 d1 $ cd d1; б) $ chmod 0111 . $ chmod 0111 d1 $ cd d1; в) $ chmod 0123 . $ chmod 0444 d1 $ cd d1; г) $ chmod 0222 . $ chmod 0222 d1 $ cd d1? Вопрос 21. Из какого каталога в какой каталог скопируется файл fil после выполнения следующего протокола $ cd $ cd d1/d2/d3 $ cp fil ../../d2? а) из d3 в текущий; б) из d3 в d2; 172
в) из текущего в d2; г) из d2 в текущий; д) из d1 в d3. Вопрос 22. Какая информация будет содержаться в текущем каталоге после выполнения следующего протокола $ mkdir a/b/c $ cd a/b/c $ ls –l? а) все файлы, кроме «скрытых»; б) только «скрытые» файлы; в) только ссылка на текущий каталог; г) только ссылка на родительский каталог; д) две ссылки – на текущий и родительский каталоги; е)только обычные файлы a, b, c. Вопрос 23. С помощью каких командных строк можно создать пустой файл full? а) $ cat 0> full; б) $ 0> full; в) $ 1> full; г) $ 2> full; д) $ > full; е) $ touch full; ж) $ full <0; з) $ cat > full. Вопрос 24. Какие из приведенных командных строк являются конвейерами и будут выполнены? а) $ ls | rmdir d2; б) $ pwd | cd …; в) $ pwd | cd ../.. | mkdir d3; г) $ rmdir | ls. Вопрос 25. Что будет выведено на экран при выполнении последней из приведенных команд: $ cd $ mkdir d1 d1/d2 $ cd d1 173
$ touch f1 f11 d2/f2 d2/f22 $ cd d2 $ ls .* ? а) . f2 f22 .. d2 f1 f11; б) . .. f1 f11; в) f2 f22; г) . .. f2 f22. Вопрос 26. Что будет выведено на экран после выполнения следующего протокола: $ echo '`ls`' ? а) `ls`; б) ls; в) '`ls`'; г) листинг текущего каталога. Вопрос 27. Что будет на экране после выполнения следующего протокола: $ ls abcd $ ls | read f1 f2 f3 $ echo $f1 $f3 ? а) a c d; б) f1 f3; в) $f1 $f3; г) a c. Вопрос 28. Какие параметры будут выведены на экран после выполнения следующего протокола: $ set a b c d aa bb cc dd $ shift; shift $ echo $1 $4 $7 ? а) a aa dd; б) set a aa dd; в) set c bb; г) c bb.
174
Вопрос 29. Что будет результатом выполнения командной строки $ p=$HOME/d/e; cd $p; cat f1 >> ../../f2 ? а) на экран буден выведен текст файла f2 каталога е; б) содержимое файла f1 из каталога е присоединится к содержимому файла f2 домашнего каталога; в) содержимое файла f1 из каталога е присоединится к содержимому файла f2 каталога d; г) содержимое файла f1 из каталога е вытеснит содержимое файла f2 домашнего каталога. Вопрос 30. Что будет на экране после выполнения следующей процедуры: #текст процедуры a=b+1; b=c+2; c=3 echo a + b + c ? а) 6 + 5 + 3; б) 14; в) правильного ответа нет; г) a + b + c. Вопрос 31. Что будет на экране после выполнения следующей процедуры: #текст процедуры a=b+1; b=c+2; c=3 v='expr $a + $b + $c' echo $v ? а) expr $a + $b + $c; б) expr 6 + 5 + 3; в) expr 14; г) 14; д) правильного ответа нет; е) expr a + b + c.
175
Вопрос 32. Что будет на экране после выполнения следующей процедуры: #текст процедуры p=$(v=abcde; expr $v : '.*') echo "$p" > f; cat f ? а) 5; б) $p; в) p; г) bcde. Вопрос 33. Что будет на экране после выполнения следующей процедуры: #текст процедуры p=$(v=ab; expr $v : '.\(.*\)') echo $p ? а) 2; б) $p; в) p; г) b. Вопрос 34. Что будет на экране после выполнения следующей процедуры: #текст процедуры x=5; y=3 z=`expr $x \< $y` echo $z > n cat n ? а) 1; б) $z; в) z; г)2; д) 0. Вопрос 35. Что будет на экране после выполнения следующего протокола по обработке обычных файлов: $ ls f1 f2 f4 $ [ -f f1 ]; echo $? > rez $ [ -f f2 ]; echo $? >> rez $ [ -f f3 ]; echo $? >> rez $ cat rez ? 176
а) 1, 1, 0; б) 3; в) true; г) false; д) 0, 0, 1. Вопрос 36. Что будет на экране консоли после выполнения следующей процедуры: #текст процедуры if cd; pwd > /dev/null then echo "true" else echo "false" fi ? а) false; б) 1; в) 0; г) true. Вопрос 37. Что будет на экране консоли после выполнения следующей процедуры: #текст процедуры if false; echo $? > fil; [ -f fil ] then cat fil else echo fil fi ? а) false; б) 0; в) 1; г) fil; д) true.
177
Вопрос 38. Сколько раз будет выполнено тело цикла в следующей shell-процедуре: #текст процедуры i=1 while [ $i -lt 5 ] do i=`expr $i + 1` done ? а) 3; б) 4; в) 5; г) правильного ответа нет; д) 0. Вопрос 39. Сколько раз будет выполнено тело цикла в следующей shell-процедуре: #текст процедуры i=1 until [ $i -ge 5 ] do i=`expr $i + 1` done ? а) 3; б) 4; в) 5; г) правильного ответа нет; д) 0. Вопрос 40. Сколько раз будет выполнено тело цикла в следующей shell-процедуре: #текст процедуры for a in 1 2 3 aa do echo $a done ? а) 3; б) 4; в) 5; г) правильного ответа нет; д) 0. 178
Вопрос 41. Сколько раз будет выполнено тело цикла в следующей shell-процедуре: #текст процедуры echo a b c > file set `cat file` while [ "$2" ] do shift done ? а) 1; б) 2; в) 3; г) правильного ответа нет; д) 0. Вопрос 42. Каким процессам доступны глобальные переменные родительского процесса для чтения и переопределения? а) порожденным процессам (дочерним); б) параллельным (по отношению к собственному) процессам; в) процессам-внукам; г) собственному процессу. Вопрос 43. Каким процессам доступны локальные переменные родительского процесса для чтения и переопределения? а) порожденным процессам (дочерним); б) параллельным (по отношению к собственному) процессам; в) процессам-внукам; г) собственному процессу. Вопрос 44. Каким процессам доступны экспортированные локальные переменные родительского процесса для чтения и переопределения? а) порожденным процессам (дочерним); б) параллельным (по отношению к собственному) процессам; в) процессам-внукам; г) собственному процессу.
179
Вопрос 45. Что будет результатом выполнения следующего протокола: $ var1=001 $ var2=002 $ export var2 $ bash $ var1=101; var2=102 $ echo "v1=$var1 v2=$var2" ? а) 101 102; б) v1=101 v2=002; в) 101 002; г) 001 002; д) v1=001 v2=002; е) v1=101 v2=102. Вопрос 46. Какие свойства процесса обеспечит запуск процедуры proc нижеуказанным способом: $ chmod a=rx proc $ proc > fil.out & ? а) разрешает вывод на экран в приоритетном режиме; б) разрешает вывод на экран с самым низким приоритетом; в) обеспечивает буферирование выходных данных в системном файле; г) разрешает вводить данные из специального файла; д) программа proc не может быть прервана управляющим сигналом с клавиатуры; е) выполнение proc в фоновом режиме. Вопрос 47. Какие действия выполняются следующей командной строкой $ nohup proc > rez & ? а) процедура запускается в фоновом режиме с блокировкой прерываний с клавиатуры; б) результаты работы процедуры перенаправляются вместо экрана в указанный файл; в) разрешается вывод на экран proc с прерыванием протокола фоновой программы rez; 180
г) процедура proc перенаправляется в файл rez и запускается в фоновом режиме. Вопрос 48. Какая команда (команды) может использоваться для получения характеристик процессов пользователя: а) ps; б) mesg; в) id; г) env; д) usage? Вопрос 49. Как можно объяснить продолжение работы процедуры в фоновом режиме даже после прекращения пользователем сеанса работы с системой, если процедура была запущена следующим образом: $ nohup proc & ? а) приоритет фонового процесса процедуры пересчитывается на более высокий оперативный; б) порождающим процессом процедуры становится процесс общесистемной программы init, независимой от конкретного shell; в) вывод процедуры осуществляется вместо экрана в системный файл nohup.out, таким образом процедура становится независимой от консоли пользователя; г) блокируются все прерывания с клавиатуры. Вопрос 50. Что будет результатом выполнения следующей команды: $ nice proc & ? а) понижение приоритета фоновой proc на десять единиц; б) повышение приоритета фоновой proc на десять единиц; в) повышение приоритета фоновой proc на одну единицу; г) процедура nice запускается в фоновом режиме; д) понижение приоритета фоновой proc на одну единицу.
181
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ 1. Топхем Д., Чыонг Х.В. ЮНИКС и КСЕНИКС / Пер. с англ. М.: Мир, 1988. 2. Забродин Л.Д. UNIX. Введение в командный интерфейс. M: ДиалогМИФИ, 1994. 3. Дунаев С. UNIX SYSTEM V. Общее руководство. М.: ДиалогМИФИ, 1995. 4. Армстронг Д. Секреты UNIX. М.:Диалектика,2000. 5. Баурн С. Введение в операционную систему UNIX. М.: Мир, 1987. 6. Дайсон П. Операционная система UNIX: настольный справочник. М.: ЛОРИ, 1997. 7. Соломенчук В. Linux. Краткий курс. СПб: Питер, 2001. 8. Ефанов Д.В., Мельников В.В., Никитин В.Д. Алгоритмы и структуры ядра Linux: Учебное пособие. М.: МИФИ, 2002. 9. МакМален Дж. UNIX / Пер. с англ. В.Л. Григорьева. М.: Компьютер, ЮНИТИ, 1996.
182
Приложение 1 КРАТКИЙ СПРАВОЧНИК КОМАНД UNIX В справочник включены только те команды, которые изучаются в данном учебном пособии и используются в примерах. BG bg – перевод задания в фоновый режим выполнения СИНТАКСИС bg % — номер_ задания ОПИСАНИЕ Переводит вычислительное задание с указаннием номеров для продолжения выполнения в фоновый режим. Приостановить длительный оперативный процесс можно так:. CAT cat — слияние и вывод файлов СИНТАКСИС cat [-u] [-s] [-v] [-t] [-e] файл... ОПИСАНИЕ Команда cat по очереди читает указанные файлы и выдает их содержимое на стандартный вывод. Если не указан ни один файл, команда cat читает данные со стандартного ввода. Опции команды cat имеют следующий смысл: -и — вывод не буферируется (по умолчанию буферируется); -s — не сообщается о несуществующих файлах; -v,t,e — визуализация печатью управляющих символов (кроме табуляций, переводов строк и переходов к новой странице). CD cd — смена текущего каталога СИНТАКСИС cd [каталог] ОПИСАНИЕ Команда cd применяется для того, чтобы сделать заданный каталог текущим. Если каталог не указан, используется значение пе183
ременной окружения $НОМЕ (обычно это каталог, в который вы попадаете сразу после входа в систему). Если каталог задан полным маршрутным именем, он становится текущим. Если маршрутное имя не полное, команда cd пытается найти каталог по одному из маршрутов, заданных переменной окружения $CDPATH. Способ задания и семантика этой переменной такие же, как у $РАТН. По отношению к новому каталогу нужно иметь право на выполнение, которое в данном случае трактуется как разрешение на поиск. CHMOD chmod — изменение режима доступа к файлам СИНТАКСИС chmod режим файл ... chmod режим каталог ... ОПИСАНИЕ Права доступа к указанным файлам или каталогам изменяются в соответствии с указанным режимом. Режим может быть задан в абсолютном или символьном виде. Абсолютный вид — восьмеричное число, являющееся логическим "ИЛИ" режимов доступа, задаваемых единицами в соответствующих разрядах кода прав доступа. Использование символьного вида основано на однобуквенных обозначениях, которые определяют класс доступа и права доступа для членов данного класса. Права доступа к файлу зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой: Владелец Группа Прочие (u) (g) (о) rwx rwx rwx Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. В примере показаны обозначения как для класса доступа, так и для прав доступа внутри класса. Для задания прав доступа в символьном виде используется следующий синтаксис: [кому] операция права. Часть кому есть комбинация букв u, g и о (владелец, члены группы и прочие пользователи соответственно). Если часть кому опущена или указано опция a, то это эквивалентно иgо. 184
Операция может быть: + (добавить право), - (лишить права), = (в пределах данного класса присвоить права абсолютно, т. е. добавить указанные права и отнять не указанные). Права — любая осмысленная комбинация следующих букв: r — право на чтение; w — право на запись; х — право на выполнение (поиск в каталоге); s — право при выполнении переустанавливать действующий идентификатор пользователя или группы и пр. СР ср — копирование файлов СИНТАКСИС ср файл! [файл2 ...] целевой_файл ОПИСАНИЕ Команда ср копирует файл1 в целевой_файл. Файл1 не должен совпадать с целевым_файлом. Если целевой_файл является каталогом, то файл1, файл2,..., копируются в него под своими именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой_файл существует и не является каталогом, его старое содержимое теряется. Режим, владелец и группа целевого_файла при этом не меняются. Если целевой_файл не существует или является каталогом, новые файлы создаются с теми же режимами, что и исходные. Время последней модификации целевого_файла, а также время последнего доступа к исходным файлам устанавливается равным времени, когда выполняется копирование. Если целевой_файл был ссылкой на другой файл, все ссылки сохраняются, а содержимое файла изменяется. DATE date — выдача и установка даты и времени СИНТАКСИС date [ммддччмм[гг]] [+формат] ОПИСАНИЕ Если аргументы команды date не указаны или аргумент начинается со знака "+", выводятся текущие дата и время; иначе устанавливается текущая дата: первые мм — это номер месяца; дд — номер 185
дня в месяце; чч — номер часа (по 24-часовой шкале); вторые мм — номер минуты; гг — две последние цифры номера года (их указывать не обязательно). ДИАГНОСТИКА No permission — Вы не являетесь суперпользователем и пытаетесь изменить дату; Bad conwersion — устанавливаемая дата синтаксически неверна; Bad format character — недопустимый описатель поля. ENV env — вывод значений переменных среды пользователя СИНТАКСИС env ОПИСАНИЕ Cреда пользователя описывает параметры, необходимые для программ, запускаемых на выполнение. Несколько наиболее общих переменных среды и смысловое содержание: TERM, COLUMNS, LINES – параметры терминала (для правильного форматирования информации); HOME – маршрутное имя начального каталога; PATH – путь поиска команд; LOGNAME – входное имя пользователя; и др. Некоторые из переменных устанавливаются для пользователя самой системой, другие устанавливаются явно в /etc/profile или .profile. FG fg – перевод задания в оперативный режим выполнения СИНТАКСИС fg % номер_ задания ОПИСАНИЕ Переводит вычислительное задание с указанным номером для продолжения выполнения в оперативный режим. FIND find — поиск файлов СИНТАКСИС find список_поиска выражение 186
ОПИСАНИЕ Команда find рекурсивно просматривает каждый каталог из перечисленных в списке_поиска, отыскивая файлы, удовлетворяющие логическому выражению, построенному с помощью описанных ниже средств. В список_поиска могут входить и обычные файлы. Далее n обозначает целое десятичное число, на месте которого могут также указываться комбинации +n, что означает "больше чем n", и -n, что означает "меньше чем п". Элементарные логические выражения и их результаты:
-name шаблон_файлов — "истина", если текущий файл удовлетворяет шаблону_файлов. Символы шаблона, имеющие для shell специальный смысл, должны быть экранированы; [-perm] [-]восъмеричное_число — "истина", если режим доступа к текущему файлу в точности равен восьмеричному_числу. Если перед восъмеричным_числом указан знак "-", то для сравнения из режима файла берутся только биты, соответствующие битам восьмеричного_числа, равным единице; -type с — "истина", если тип файла с, где с есть b, с, d, p, или f — блочный или символьный специальный файл, каталог, именованный канал или обычный файл; -links n — "истина", если на файл имеется n ссылок; -user имя_полъзователя — "истина", если файл принадлежит пользователю с данным именем. Если имя_полъзователя является числом и не встречается в файле /etc/passwd, оно рассматривается как идентификатор пользователя; -group имя_группы — "истина", если файл принадлежит группе с данным именем. Если имя_группы является числом и не встречается в файле /etc/group, оно рассматривается как идентификатор группы; -size п[с] — "истина", если файл занимает n блоков (по 512 байт). Если указана буква с, то размер файла задается в символах. Напомним, что с помощью комбинаций -г-н и -n можно проверять размер (и три указанные ниже характеристики) не только на равенство, но и на неравенство; -ехес команда — "истина", если после выполнения команды возвращается нулевой код завершения. Запись команды должна заканчиваться экранированной точкой с запятой. Аргумент ко187
манды {} заменяется текущим маршрутным именем файла .(выражение). "Истина", если истинно заключенное в скобки выражение (скобки должны быть экранированы от интерпретации shell). Элементарные логические выражения могут комбинироваться с помощью следующих операций (в порядке уменьшения приоритета): 1. Унарная операция отрицания, обозначается !. 2. Логическое "И", обозначается пробелом. 3. Логическое "ИЛИ", обозначается -о. GREP grep — поиск в файле шаблона, заданного ограниченным регулярным выражением СИНТАКСИС grер [опции] ограниченное_регулярное_выражение [файлы] ОПИСАНИЕ Команда grep сопоставляет строки исходных файлов с шаблоном, заданным ограниченным_регулярным_выражением. Если файлы не указаны, используется стандартный ввод. Обычно каждая успешно сопоставленная строка копируется на стандартный вывод; если исходных файлов несколько, перед найденной строкой выдается имя файла. В grep используется компактный недетерминированный алгоритм. В качестве . шаблонов воспринимаются ограниченные регулярные выражения (выражения, имеющие своими значениями цепочки символов и использующие ограниченный набор алфавитно-цифровых и специальных символов). Для экранирования управляющих символов от интерпретации shell проще всего заключать ограниченное_регулярное_ выражение в одинарные кавычки. В командной строке могут задаваться следующие опции: -с — выдавать только количество успешно сопоставленных строк; -i — при сопоставлении не различать большие и малые буквы; -l — выдавать только имена файлов, в которых есть успешно сопоставленные строки, разделяя имена переводами строк; -n — перед каждой строкой ставить ее номер в файле (строки нумеруются с 1); 188
-s — подавить выдачу диагностических сообщений о несуществующих и недоступных для чтения файлах; -v — выдавать только строки, не удовлетворяющие шаблону. ID id — вывод идентификаторов пользователя и его группы СИНТАКСИС id ОПИСАНИЕ Операционная система работает с числовыми идентификаторами, имена в символьной форме служат только для удобства их восприятия пользователем. Команда выводит значения идентификаторов на момент ее исполнения. Все идентификаторы хранятся в соответствующих двух файлах - /etc/passwd и /etc/group. Каждая группа разрешает доступ к разделяемым файлам. Группы формируются по профессиональному признаку. JOBS jobs — вывод списка выполняемых заданий СИНТАКСИС jobs [-lp] ОПИСАНИЕ Команда без опций выводит список активных заданий – имена заданий и их номера. Значение опций: l — вместе с номером задания отображает и номер процесса; p — выводится идентификатор процесса. KILL kill — терминирование процесса СИНТАКСИС kill [-номер_сигнала] идентификатор_процесса... ОПИСАНИЕ По умолчанию команда kill посылает сигнал 15 (завершиться) процессу с указанным идентификатором. Таким способом обычно терминируют процесс, который не устанавливает стандартную реакцию на сигналы. Идентификаторы_процессов можно узнать по команде ps (в колонке PID). Идентификатор асинхронно запу189
щенного процесса сообщается shell в момент запуска (в случае конвейера сообщается только идентификатор последнего процесса). Терминируемый процесс должен принадлежать текущему пользователю, если последний не является суперпользователем. Если в качестве первого аргумента указан (с предшествующим знаком "-") номер_сигнала, то вместо сигнала 15 посылается его значение. Так, команда kill -9 ... завершает процесс наверняка, если, конечно, для этого хватает прав. LN ln — создание ссылки на файл СИНТАКСИС ^ ln [-f] фа-йл1 [файл2 ...] целевой _файл ОПИСАНИЕ Команда ln делает целевой_файл ссылкой на файл1. Файл1 не должен совпадать с целевым_файлом. Если целевой_файл является каталогом, то в нем создаются ссылки на файл1, файл2,... с теми же именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой_файл существует и не является каталогом, его старое содержимое теряется. Если при этом обнаруживается, что в целевой_файл не разрешена запись, то выводится режим этого файла и запрашивается строка со стандартного ввода. Если эта строка начинается с символа у, то требуемые действия все же выполняются, при условии, что у пользователя достаточно прав для удаления целевого_файла. Если был указан флаг -/ или стандартный ввод назначен не на терминал, то требуемые действия выполняются без всяких запросов. Целевой_файл наследует режим файла 1. Команда ln не создает ссылок между разными файловыми системами, поскольку они (файловые системы) могут добавляться и удаляться. IS Is — выдача информации о файлах или каталогах СИНТАКСИС Is [-RadCxrnlnogrtucpFbqisf] [имена] 190
ОПИСАНИЕ Команда Is для каждого имени каталога распечатывает список входящих в этот каталог файлов; для файлов — повторяется имя файла и выводится дополнительная информация в соответствии с указанными флагами. По умолчанию имена файлов выводятся в алфавитном порядке. Если имена не заданы, выдается содержимое текущего каталога. Если заданы несколько аргументов, то они сортируются по алфавиту, сначала всегда идут файлы, а потом каталоги с их содержимым. Командой Is обрабатываются в том числе из общего списка опций следующие флаги: -а — вывести список всех файлов (обычно не выводятся файлы, имена которых начинаются с точки); -d — если аргумент является каталогом, то выводить только его имя, а не содержимое. Часто используется с флагом -I для получения сведений о состоянии каталога; -С — вывод в несколько колонок с сортировкой по колонкам; -т — вывод в свободном формате, имена файлов разделяются запятыми; -l — вывод в длинном формате: перед именами файлов выдается режим доступа, количество ссылок на файл, имена владельца и группы, размер в байтах и время последней модификации. Если файл является специальным, то в поле размера выводится старший и младший номер устройства; -t — имена файлов сортируются не по алфавиту, а по времени (сначала идут самые свежие файлы). По умолчанию используется время последнего изменения. Режим доступа к файлу при указании флага -I выводится в виде 10 символов. Первый символ означает: d — файл является директорией; b — файл является специальным блочным файлом; с — файл является специальным символьным файлом; р — файл является именованным каналом; - — обычный файл. Остальные девять символов делятся на три группы по три символа (r,w,x): права доступа владельца, других пользователей из его группы, всех прочих пользователей.
191
MAIL mail — отправка пользователям почты или ее чтение СИНТАКСИС mail [-о] [-s] [-w] [-t] адресат … mail [-е] [-h] [-p] [-q] [-r] [-f файл][-F адресат ...] ОПИСАНИЕ Отправка почты: -w — отправить письмо удаленному пользователю без ожидания завершения пересылки; -t — добавить к письму строку "То: адресаты", что позволяет получателю знать всех адресатов письма. Адресат обычно задается как входное имя пользователя [login]. Если адресат задан, предполагается, что выполняется отправка почты (за исключением случая опции -F). При этом текст отправляемого сообщения читается со стандартного ввода, пока либо не будет введен символ конца файла (CTRL+D), либо не будет введена строка, состоящая из единственной точки. Затем команда mail добавляет письмо к почтовому файлу каждого адресата. Письмо — это сообщение, перед которым стоит почтовый штемпель. Почтовый штемпель состоит из одной или нескольких строк "From ...", за которыми идет пустая строка (если только не была использована опция -s). Если будет обнаружено, что письмо не может быть доставлено, то оно вернется к отправителю с диагностикой места и причины неудачи. Если локальная система входит в стандартную коммуникационную сеть, можно отправить почту пользователю удаленной системы, адрес которого задается обычным для сети образом: имя_системы![имя_системы!...]имя_полъзователя Чтение почты На чтение почты воздействуют следующие опции: -е — установка кода завершения без вывода почты. Нулевое значение кода завершения означает, что у пользователя есть почта, в противном случае возвращается 1; -h — показ окна с заголовками писем, а не текстов писем. Затем выдается приглашение "?"; -р — вывод текстов всех писем без промежуточных приглашений;
192
-q — завершить работу команды mail после получения прерывания. В противном случае прерывание вызывает лишь прекращение вывода текста письма; -r — выводить тексты писем в порядке поступления; -f файл — использовать файл вместо подразумеваемого почтового файла; -F адресат — вызывает переадресацию последующей почты указанному адресату. Опция допустима, только когда у пользователя нет почты. По умолчанию команда mail выводит тексты писем в порядке, обратном к порядку их поступления, т. е. сначала выдается самая свежая почта. После выполнения очередного действия происходит либо выход из mail, если было обработано последнее письмо, либо выдается приглашение (символ "?") и со стандартного ввода читается строка, определяющая следующую команду. Для обработки и просмотра почты доступны следующие команды: перевод _строки, + или п Перейти к следующему письму; -d или dp — удалить письмо и перейти к следующему. Как и в двух последующих командах, собственно удаление произойдет лишь в конце сеанса работы с mail; -d п . — удалить письмо с номером n (письма нумеруются с 1, в порядке поступления). Не переходить к следующему письму; -. dq — удалить письмо и выйти из mail; -s [файл ...] — сохранить письмо в указанных файлах (по умолчанию используется файл $НОМЕ/тbох). Из почтового файла письмо удаляется; -т [адерсат ...] — переслать текущее письмо указанным адресатам; -q или CTRL+D — оставить в почтовом файле только неудаленные письма и завершить сеанс работы с командой mail; -х — оставить почтовый файл неизменным и завершить сеанс работы с командой mail; -! команда — выполнить одну команду shell; -? — показать перечень команд. При входе в систему пользователю сообщается о наличии для него почты, если она есть. Также сообщается о появлении новой почты во время сеанса работы с командой mail. 193
MESG mesg — разрешает или запрещает сообщения СИНТАКСИС mesg[n] или [у] ОПИСАНИЕ Команда mesg с аргументом n, лишая права записи всех, кроме владельца, запрещает посылать сообщения на терминал пользователя с помощью команды write. Команда mesg с аргументом у восстанавливает право посылки сообщений. Mesg без аргументов сообщает о состоянии терминала (is у — посылка разрешена, is n — запрещена), не меняя состояние. USAGE usage — выдача описания команд и примеров использования СИНТАКСИС [help] usage [-d] [-е] [-о] [имя_команды] ОПИСАНИЕ Команда справочной службы usage выдает информацию о командах системы UNIX. Будучи вызванной без аргументов, usage выводит на экран меню, приглашающее пользователя или ввести имя команды, или получить список команд, поддерживаемых в usage. Пользователь может также вернуться в систему, введя q ("quit" - выйти). MKDIR mkdir — создание каталога СИНТАКСИС mkdir [-т режим_доступа] [-р] каталог... ОПИСАНИЕ По команде mkdir создается один или несколько каталогов с режимом доступа 0777 [возможно, измененном с учетом umask(l) и опции -т]. Стандартные файлы ("." — для самого каталога и ".." — для вышележащего) создаются автоматически; их нельзя создать по имени. Для создания каталога необходимо располагать правом записи в вышележащий каталог. Идентификаторы владельца и группы новых директорий устанавливаются, соответственно, равными реальным идентификаторам владельца и группы процесса. 194
Командой mkdir обрабатываются две опции: -t режим_доступа — явное задание режима_доступа для создаваемых каталогов [см. chmod];. -р — при указании этой опции перед созданием нового каталога предварительно создаются все несуществовавшие ранее вышележащие каталоги, указанные в виде маршрутного имени в команде. MORE more — вывод содержимого файла СИНТАКСИС more [имя_файла] ОПИСАНИЕ Команда осуществляет поэкранный вывод содержимого файла. Команда обладает другими широкими возможностями управления выводом с помощью ключей и собственных команд типа команд vi. Назначение управляющих клавиш: «q» — выход из команды; «Return» — вывод очередной строки; «Spase» — вывод очередного экрана с информацией. MV mv — перемещение (переименование) файлов СИНТАКСИС mv [-f ] фа-йл1 [файл2...] целевой_файл ОПИСАНИЕ Команда mv перемещает (переименовывает) файл1 в целевой_файл. Файл1 не должен совпадать с иелевым_файлом. Если целевой_файл является каталогом, то файл1, файл2,... перемещаются в него под своими именами. Только в этом случае можно указывать несколько исходных файлов. Если целевой_файл существует и не является каталогом, его старое содержимое теряется. Если при этом обнаруживается, что в целевой_файл не разрешена запись, то выводится режим этого файла и запрашивается строка со стандартного ввода. Если файл1 является каталогом, то он переименовывается в целевой_файл, только если у этих двух каталогов общий надкаталог; при этом все файлы, находившиеся в файле1, перемещаются под своими именами в целевой_файл. Если файл1 является файлом, а 195
целевой_файл — ссылкой, причем не единственной, на другой файл, то все остальные ссылки сохраняются, а целевой_файл становится новым независимым файлом. NICE nice — выполнение команды с пониженным приоритетом СИНТАКСИС nice. [-коэффициент_понижения] команда [аргументы] ОПИСАНИЕ Команда nice выполняет команду с пониженным приоритетом. Коэффициент_понижения задается в диапазоне 1-19 (по умолчанию равен 10). Суперпользователь может выполнять команды с повышенным приоритетом, для этого нужно указать отрицательный коэффициент_понижения, например -10. Коэффициент_понижения, больший 19, принимается равным 19. Если обычный пользователь указывает отрицательный коэффициент_понижения, команда выполняется с нормальным приоритетом. NOHUP nohup – защищает команду от прерываний при выходе пользователя из системы СИНТАКСИС nohup <команда> & ОПИСАНИЕ Защищает <команду>, выполняемую в фоновом режиме, от прерываний, возникающих при выходе пользователя этого процесса из системы. Выполнение фонового процесса продолжается несмотря на то, что его родительский shell уже завершен. Родителем защищенной команды становится процесс с номером 1 (init). В противном случае выход из системы приводит автоматически к прекращению выполнения фоновых заданий. Обычно при использовании этой команды стандартный вывод и стандартный протокол защищенной команды должны перенаправляться пользователем в собственный файл. Если файл вывода не указывается, то nohup сама обеспечивает перенаправление в файл nohup.out. 196
PS ps — выдача информации о состоянии процессов СИНТАКСИС ps [опции] ОПИСАНИЕ Команда ps выдает информацию об активных процессах. По умолчанию информация дается только о процессах, ассоциированных с данным терминалом. Выводятся идентификатор процесса, идентификатор терминала, истраченное к данному моменту время ЦП и имя команды. Если нужна иная информация, следует пользоваться опциями. Некоторые опции имеют один аргумент или список аргументов. Аргументы в списке могут быть либо отделены друг от друга запятыми, либо все вместе заключены в двойные кавычки и отделены пробелами или запятыми. Аргументы в списке_процессов и в списке_групп должны быть числами. Командой ps обрабатываются следующие опции: -е — вывести информацию обо всех процессах; -а — вывести информацию обо всех наиболее часто запрашиваемых процессах, т.е. обо всех процессах, кроме лидеров групп и процессов, не ассоциированных с терминалом; -f — генерировать полный листинг (см. ниже разъяснение смысла колонок); -l — генерировать листинг в длинном формате (см. ниже); -t— список_терминалов. Выдавать информацию только о процессах, ассоциированных с терминалами из заданного списка_терминалов. Терминал — это либо имя файла-устройства, например ttyномер или console, либо просто номер, если имя файла начинается с tty; -р — cписок_идентификаторов_процессов. Выдавать информацию только об указанных процессах; и список_идентификаторов_пользователей — выдавать информацию только о процессах с заданными идентификаторами или входными именами пользователей. Идентификатор пользователя выводится в числовом виде, а при наличии опции -f — в символьном; -g — список_идентификаторов_лидеров_групп. Выводить информацию только о процессах, для которых указаны идентификаторы лидеров групп. Лидер группы — это процесс, номер которого 197
идентичен его идентификатору группы. Shell, запускаемый при входе в систему, является стандартным примером лидера группы. При указании опции -f ps пытается определить имя команды и аргументы, с которыми был создан процесс, исследуя пользовательский блок процесса. Если это не удается, имя процесса выводится так же, как и при отсутствии опции -f, только заключается в квадратные скобки. Ниже приводятся заголовки колонок выдачи и объясняется смысл их содержимого. Буква l или f в скобках означает, что эта колонка появляется соответственно при длинном или полном формате выдачи; отсутствие букв означает, что данная колонка выводится всегда. ЗАГОЛОВКИ F(l) Флаги (шестнадцатеричные), логическая сумма которых дает следующие сведения о процессе: 00 — процесс терминирован; элемент таблицы процессов свободен; 01 — системный процесс: всегда в основной памяти; 02 — процесс трассируется родительским процессом; 04 — родительский трассировочный сигнал остановил процесс; родительский процесс ждет; 08 — процесс не может быть разбужен сигналом; 10 — процесс в основной памяти; 20 — процесс в основной памяти; блокирован до завершения события; 40 — идет сигнал к удаленной системе; 80 — процесс в очереди на ввод/вывод. S(l) Статус процесса: О — активный: обрабатывается процессором; S — спящий: ожидает завершения события; R — готов: стоит в очереди на выполнение; I — рождающийся: процесс создается; Z — состояние "зомби": процесс завершен, но родительский процесс не ждет этого; Т — трассируемый: процесс остановлен сигналом, так как родительский процесс трассирует его; Х — свопируемый: процесс ожидает получения большего объема основной памяти; 198
UID(f,l) — идентификатор владельца процесса; при указании опции -/ выдается входное имя пользователя; PJD — идентификатор процесса (необходим для терминирования процесса); PPID(f,l) — идентификатор родительского процесса; C(f,l) — доля выделенного планировщиком времени ЦП; STIME(f) — время запуска процесса (часы:минуты:секунды). Если процесс запущен более чем 24 часа назад, выдается месяц и день запуска; PRI(l) — приоритет процесса; большее число означает меньший приоритет; N1(1) — поправка к приоритету; ADDR(l) — адрес процесса в памяти; SZ(l) — размер (в страницах по 512 байт) свопируемого образа процесса в основной памяти; WCHAN(l) — адрес события, которого ожидает процесс; TTY — управляющий терминал (обычно — терминал, с которого был запущен процесс). Если такового нет, выдается символ "?"; TIME — истраченное процессом время ЦП; COMMAND — имя программы; если указана опция -f, то, выводится полное имя команды и ее аргументы. Процесс, закончивший выполнение своей программы и имеющий родительский процесс, не дождавшийся еще завершения, в качестве имени программы получает <defunct>. Во время выполнения команды ps положение вещей может измениться; таким образом, ps дает лишь хорошее приближение к действительности. Некоторые сведения, относящиеся к процессам, отмеченным как <defunct>, не соответствуют действительности. Если не указана ни одна из опций -t, -p, -и, -д, команда ps проверяет стандартный ввод, стандартный вывод и стандартный протокол (в указанном порядке) для определения управляющего терминала и пытается вывести информацию о процессах, ассоциированных с этим терминалом. В ситуации, когда все три стандартных направления ввода/вывода переназначены, ps не может найти и выдать имя управляющего терминала. Команда ps -ef может не отметить начало входа в систему, а вывести сведения о последнем запуске для данной терминальной линии.
199
PWD pwd — выдача имени текущего каталога СИНТАКСИС pwd ОПИСАНИЕ Команда pwd выдает имя текущего (рабочего) каталога. RM rm — удаление файлов или каталогов СИНТАКСИС rm [-f] [-г] файл ... rm -r [-f] [-г] каталог ... [файл ...] ОПИСАНИЕ Команда rm служит для удаления указанных имен файлов из каталога. Если заданное имя было последней ссылкой на файл, то файл уничтожается. Для удаления пользователь должен обладать правом записи в каталог; иметь право на чтение или запись файла необязательно. Если нет права на запись в файл и стандартный ввод назначен на терминал, то выдается (в восьмеричном виде) режим доступа к файлу и запрашивается подтверждение; если оно начинается с буквы у, то файл удаляется, иначе — нет. Допускаются следующие три опции: -f — команда не выдает сообщений, когда удаляемый файл не существует, не запрашивает подтверждения при удалении файлов, на запись в которые нет прав. Если нет права и на запись в каталог, файлы не удаляются. Сообщение об ошибке выдается лишь при попытке удалить каталог, не имея прав на запись в него (см. опцию -r); -r — происходит рекурсивное удаление всех каталогов и подкаталогов, перечисленных в списке аргументов. Сначала каталоги опустошаются, затем удаляются. Подтверждение при удалении файлов, на запись в которые нет прав, не запрашивается, если задана опция -f, или стандартный ввод не назначен на терминал и не задана опция -i. При удалении непустых каталогов команда rm -r предпочтительнее команды rmdir, так как последняя способна удалить только пустой каталог;
200
-i — перед удалением каждого файла запрашивается подтверждение. Опция -i устраняет действие опции -f; она действует даже тогда, когда стандартный ввод не назначен на терминал. RMDIR rmdir — удаление каталогов СИНТАКСИС rmdir [-p] [-s] каталог... ОПИСАНИЕ Команда rmdir удаляет указанные каталоги, которые должны быть пустыми. Для удаления каталога вместе с содержимым следует воспользоваться командой rm с опцией -r. Текущий каталог не должен принадлежать поддереву иерархии файлов с корнем — удаляемым каталогом. Для удаления каталогов нужно иметь те же права доступа, что и в случае удаления обычных файлов. Командой rmdir обрабатываются следующие флаги: -p — позволяет удалить каталог и вышележащие каталоги, оказавшиеся пустыми. На вывод выдается сообщение об удалении указанных в маршруте каталогов или о сохранении части из них по каким-либо причинам; -s — подавление сообщения, выдаваемого при действии флага -р. SORT sort — алфавитная и числовая сортировка строк СИНТАКСИС sorl [-ndu] [-k номер_поля_сортировки] [имя_файла] ОПИСАНИЕ Команда обладает широкими возможностями. В данном формате позволяет упорядочить строки файла в алфавитном порядке или по числовому значению. Без опций осуществляет осуществляет сортировку по алфавиту. Значения опций: n – числовая сортировка; d – по принципу словаря (игнорируются любые символы, не являющиеся буквами, цифрами или пробелами); u – уникальная (исключаются повторяющиеся строки). Номер_поля_сортировки — указывается базовое поле в структуре строки для выполнения сортировки. 201
TOUCH touch — изменение времени последней модификации файла на текущее СИНТАКСИС touch - [-amc] имя_файла ОПИСАНИЕ Команда изменяет временную характеристику указанного файла на текущее значение или на значение, указанное в опциях. Содержимое файла не меняется. Если файл с указанным именем не существует, то создается новый пустой файл с указанным именем. Значение опций: a [время] — установить время последнего доступа к файлу равным время или текущему; m [время] — установить время последней модификации равным время или текущему; с — если файл не существует, то и не создавать его. Если опции не указываются, то создается новый файл. UMASK umask — установка маски режима создания файлов СИНТАКСИС umask [ооо] ОПИСАНИЕ Пользовательской маске режима создания файлов присваивается восьмеричное значение ооо. Три восмеричные цифры соответствуют правам на чтение, запись, выполнение для владельца, членов группы и прочих пользователей соответственно. Значение каждой заданной в маске цифры вычитается из соответствующей "цифры", определенной системой при создании файла. Если аргумент ооо не указан, выдается текущее значение маски. Команду umask можно включить в пользовательский профайл [profile}; тогда она будет автоматически вызываться при входе в систему и устанавливать нужный режим доступа к создаваемым файлам и каталогам. WC we — подсчет количества символов, слов и строк в файле СИНТАКСИС we [-lwc] [файл...] 202
ОПИСАНИЕ Команда wc подсчитывает строки, слова и символы, читая их из указанных файлов или со стандартного ввода, если файлы не заданы. Подсчитывается также общий итог для всех указанных файлов. Слово — это максимальная цепочка символов, не содержащая пробелов, табуляций и переводов строк. Опциям команды wc приписан следующий смысл: -l — подсчет числа строк; -w — подсчет числа слов; -с — подсчет числа символов. Можно задавать любую комбинацию этих флагов. По умолчанию используется набор -lwc. Если в командной строке указаны имена файлов, то они выводятся после соответствующих сумм. WHO who — кто работает в системе? СИНТАКСИС who [-uTIHqpdbrtas] [файл] who am i ОПИСАНИЕ Команда who сообщает в зависимости от указаннык опций имя пользователя, имя терминальной линии, астрономическое время начала сеанса, продолжительность бездействия терминальной линии с момента последнего обмена, идентификатор процесса интерпретатора команд shell для каждого пользователя, работающего в системе UNIX. Команда who с опциями am i или am I идентифицирует обратившегося к ней пользователя. Выдаваемые сообщения имеют следующий формат: NAME [STATE] LINE TIME [IDLE] [PID] [COMMENT] [EXIT]. Информация NAME, LINE и TIME выдается при всех опциях. WRITE write — передача сообщений другому пользователю СИНТАКСИС write пользователь [линия] ОПИСАНИЕ Команда копирует строки с вашего терминала на терминал другого пользователя. Сеанс связи будет продолжаться до тех пор, 203
пока с терминала не будет считан символ конца файла, или не будет послано прерывание, или адресат не выполнит команду "mesg n", после чего команда write передаст сообщение EOT (конец передачи) на другой терминал и завершит свое выполнение. Пользователь может разрешить или запретить передачу сообщений на свой терминал, используя команду mesg. При использовании команды write рекомендуется придерживаться следующего протокола: если вы только что выдали команду write, то дождитесь ответа адресата, прежде чем что-либо ему передавать. Каждый должен заканчивать сообщение четко различимым признаком конца, чтобы партнер знал, когда отвечать.
Приложение 2 ПЕРЕЧЕНЬ ПРАВИЛЬНЫХ ОТВЕТОВ НА ТЕСТОВЫЕ ВОПРОСЫ (раздел 14) 1: б 2: б 3: а 4: а, б, г, д, е 5: г 6: г 7: а 8: г 9: а 10: в
11: в 12: в 13: а, в 14: б 15: в 16: в 17: б 18: г, е 19: б 20: б
21: б, в 22: б, д 23: а, б, д, е, з 24: а, б, в 25: а 26: а 27: а 28: г 29: б 30: г
204
31: а 32: а 33: г 34: д 35: д 36: г 37: в 38: б 39: б 40: б
41: б 42: а, в, г 43: г 44: а, в, г 45: е 46: д, е 47: а, б 48: а 49: б 50: а