Введение в Unix

         

Соединение команд каналами (pipeline)


Стандартный вывод одной команды может быть стандартным вводом следующей команды. Обозначается знаком | (вертикальная черта).

Пример:

$ who | wc -l - создание списка активных пользователей и подсчет их числа (count); 19 - ответ, то есть 19 пользователей.

$

Пример:

$ ls -l /tmp | grep maryann | sort +3nr | lpr листинг поиск записей, сортировка печать каталога содержащих (по 4-му по- упорядо- /tmp строку "maryann" лю) найденных ченного записей списка



Соглашения по наименованию каталогов и файлов


Малые и большие буквы считаются различными. Символы . и _ разрешены только внутри имени. Тип файла указывается окончанием имени точкой с символом (основные):

.c - программа на C (например, program.c);

.h - текст на C, включаемый в программу на C (header);

.f - программа на языке ФОРТРАН;

.p - программа на языке ПАСКАЛЬ;

.o - объектный код, полученный транслятором с любого языка;

.a - библиотечный (архивный) файл.



Сохранение части текста для последующего использования (yank)


yw - сохранить слово (курсор - в начале слова);



yy (или Y) - сохранить одну строку ;

5yy (или 5Y) - сохранить 5 строк;

и т.п. (в анонимном буфере).

Именованные буфера имеют имена из одной буквы от a до z; доступ к буферу - по имени имеет вид "x, где x - имя буфера.

Запись в буфер a

"a3yy - сохранить 3 строки в буфере a (с начала буфера).

Вставка текста из анонимного буфера (как обычно):

p - после текущей строки;

P - перед ней.

Вставка текста из именованного буфера:

"ap - после текущей строки из буфера a;

"aP - перед ней из буфера a.

Добавление в буфер:

"aAdd - добавить к a уничтоженную по dd текущую строку.



Сохранение и восстановление файлов


Независимо от объема данных, в системе важно иметь регулярную процедуру сохранения (копирования) файлов, чтобы обеспечить восстановление в случае их аварийной потери.

Возможны различные способы сохранения. Наиболее распространенным является еженедельное полное копирование и ежедневное инкременантное копирование (только изменившихся со времени последнего копирования) файлов. При этом файлы копируются (сбрасываются) на специальное внешнее устройство памяти, обычно магнитную ленту, однако это может быть и съемный дисковый том, а для малых систем - гибкий диск. На этом устройстве файлы хранятся в специальном архивном формате.

Восстановление утраченных файлов производится путем их поименного копирования из архивной ленты или тома в файловую систему. Обычно таких файлов немного (например, один или два).

В различных реализациях системы могут быть разные команды сброса файлов в архив и восстановления их из архива. Это может быть пара команд dump и restor для передачи файлов в архив и обратно соответственно. Или это может быть одна команда cpio (или tcio для кассетной ленты) с опциями -0 или -i для сброса в архив и извлечения из архива соответственно.

Наиболее мощным средством сброса в архив в некоторых реализациях служит команда backup, являющаяся командным файлом, использующим команды типа cpio/tcio и fsck.

Команда backup позволяет параметрировать процедуру сброса в архив простым редактированием ее текста, задавая следующие параметры:

имя каталога сбрасываемой иерархии файлов; имя учетного файла процедуры сброса; имя даты последнего сброса; имя файла с напоминанием смены архивной ленты (если архив не умещается на одной ленте); спецификация архивного устройства; имя учетного файла процедуры проверки файловой системы.




Наконец, для сброса на ленту или гибкий диск и обратного восстановления применяется команда tar (tape archive). В отличие от некоторых перечисленных выше команд, она доступна не только администратору системы, но и любому пользователю. Например, чтобы сбросить все файлы текущего каталога на гибкий диск, создавая архив впервые (опция c - create), надо выполнить команду:

tar cf /dev/fl0 *

Опция f (file) указывает, что следующий параметр является именем спецфайла, соответствующего архивному устройству; * - метасимвол, показывающий, что копируются в архив все файлы.

Для просмотра содержимого архива надо употребить опцию t (listing):

tar tf /dev/fl0

Чтобы извлечь из архива указанные файлы, надо выполнить эту же команду с опцией x (extract). Например, для восстановления всех файлов, имена которых оканчиваются на people, надо выполнить команду:

tar xf /dev/fl0 *people

Файлы с этими именами уже должны существовать в текущем каталоге. В случае, если в текущем каталоге указанных файлов нет, можно восстановить все файлы из архива в указанном каталоге, например:

tar xf /dev/fl0 mary,

где mary - каталог.




Сопровождение программ: make


Если программный продукт велик, содержит много исходных, объектных и исполняемых модулей, задача его сопровождения и модификации может быть облегчена утилитой make, которая позволяет автоматизировать все рутинные операции по перетрансляции и перелинкированию всех или части модулей при внесении в них изменений.

Утилита make работает с файлом Makefile, в который записывается необходимая информация о всех файлах программы и связях между ними.

Пример:

$ cat Makefile FILES = test.f check.f prove.f OBJECTS = test.o check.o prove.o test: $ {OBJECTS} ld -o test/lib/frt0.o ${OBJECTS} -lF77 $

Как видно из примера, в файле Makefile помещаются макроопределения, имеющие вид:

строка1 = строка2

и правила, имеющие вид:

конечный файл : исходные файлы команда

Первая строка правила называется зависимостью. Зависимость указывает, что конечный файл является результатом работы команды, указанной во второй строке правила, над исходными файлами. Внутри зависимости можно ссылаться на макроопределения в форме $(строка1).

Подготовив такой Makefile, можно модифицировать программу test одним вызовом команды make, например:

$ make fc -c test.f fc -c check.f fc -c prove.f ld -o test/lib/frt0.o check.o prove.o -lF77 $

Команда выполняется только в том случае, если дата создания или модификации конечного файла меньше, чем соответствующая дата хотя бы одного исходного файла (то есть если конечный файл устарел).

Возможно изменить только часть программы, например:

$ make prove.o fc -c prove.f $

В данном случае утилита make по умолчанию "знает", что файл prove.o зависит от файла prove.f и реализация этой зависимости есть указанный вызов компилятора.

Полезный ключ -n утилиты make позволяет не выполняя предписанных действий предварительно посмотреть, что было бы выполнено, если бы ключ не был подан.

Подробнее о make можно узнать из руководства по команде make и книг [7,8].



Сортировка текстовых файлов


Утилита sort упорядочивает записи файла в алфавитно-цифровом порядке.

Пример:

$ sort people Bill Williams 100 Henry Morgan 112 Mary Clark 101 $

Записи отсортированы по первой букве имени. Однако можно выполнить сортировку и по фамилиям:

$ sort +1 people Mary Clark 102 Henry Morgan 112 Bill Williams 100 $

Ключ +1 означает, что одно поле с начала записи было игнорировано при сортировке.

Сортировка по третьему полю с игнорированием лидирующих пробелов выполняется с использованием ключа -b (blank):

$ sort -b +2 people Bill Williams 100 Mary Clark 101 Henry Morgan 112 $

Для сохранения результата сортировки в файле используется ключ -o (output):

sort -o sortpeople +1 people

Для слияния уже отсортированных файлов используется ключ -m. Пример:

$ sort +1 admpeople > sortadm $ sort +1 hardpeople > sorthard $ sort +1 sortpeople > sortsoft $ sort -m +1 sortadm, sorthard, sortsoft > sortall $

Имеется возможность удаления дублированных записей, используя ключ -u (uniq), а также сортировки по нескольким несмежным полям.



СОСТАВ СИСТЕМЫ


Система UNIX разработана в подразделении Computing Science Research Group фирмы Bell Labs в штате Нью-Джерси в США. Принципы ее построения были описаны первоначально в ряде статей журнала этой фирмы [1], а различные аспекты ее использования - в ряде книг [2,3,4].



Создание файла командой cat


Если не задан входной файл, то будет предполагаться стандартный ввод (клавиатура). Одновременно перенаправим вывод в новый (создаваемый) файл

$cat > newfile.

Здесь стандартный ввод буферизован: накопление 512 (обычно) знаков и потом ввод.

Небуферизованный (лучше, на случай сбоев) ввод с ключом -u (unbuffered):

$ cat -u > people Mary 101 Sally 113 Jana 121 ^d [для конца текста(EOF)]

$

Можно добавлять:

$ cat -u >> people Charlie 122 Bill 100 ^d $



Создание и монтаж файловой системы


Команда mkfs создает новую файловую систему. Она расположена в каталоге /etc и имеет два параметра:

/etc/mkfs <имя> <размер>

Первый параметр является именем специального файла и указывает устройство, на котором создается файловая система.

Второй параметр - размер пространства файловой системы в блоках; используется для определения по некоторым правилам числа блоков после того, как размещены i-узлы.

Пример создания файловой системы на флоппи-диске:

/etc/mkfs /dev/flo 2000 isize = 230

Ответное сообщение указывает число блоков, выделенное для размещения i-узлов.

Далее, чтобы сделать файловую систему известной операционной системе, надо ее смонтировать командой mount. Эта команда подключает корневой каталог монтируемой файловой системы в один из каталогов корневой файловой системы. Команда расположена в каталоге /etc и имеет два параметра:

/etc/mount <устройство> <каталог>

Первый параметр является именем спецфайла для монтируемого логического устройства, содержащего подключаемую файловую истему. Второй - имя уже существующего каталога, под которым монтируется файловая система.

Пример монтажа вновь созданной файловой системы на гибком диске под каталогом, созданным командой mkdir в корне корневой файловой системы:

cd / mkdir floppy0 /etc/mount /dev/fl0 /fioppy0

Чтобы выяснить, какие файловые системы смонтированы в данный момент, надо подать команду mount без параметров:

mount /dev/fl0 on /floppy0

Ответом является сообщение об этих системах (в данному случае - одной). Оно формируется на основе данных о монтаже файловых систем, хранимых в файле etc/mnttab.

Следует заботиться о том, чтобы права доступа корневого каталога монтируемой файловой системы и каталога, под которым производится монтаж, были одинаковыми во избежание ошибок операционной системы.



Создание каталога пользователем


Ваш рабочий каталог, являющийся корнем вашей ветви ФС, создается администратором. Вы можете создать нижележащие каталоги командой mkdir (make directory).

Типичная структура каталогов пользователей (с учетом групп):

Для создания такой структуры следует выполнить команды:

$ cd - вернуться "домой" (home);

$ mkdir progs texts - создать каталоги в home;

$ cd progs - перейти в каталог progs;

$ mkdir c p f - создать каталоги в progs

и так далее.



Специальные режимы исполняемого файла


Кроме девяти режимов защиты файла имеется три дополнительных режима, которые имеют смысл только для исполняемых файлов. Эти режимы может установить только суперпользователь, используя команду chmod (change mode).

Специальные режимы соответствуют восьмеричным значениям 4000, 2000 и 1000 первого параметра этой команды:

4000 - бит установки идентификатора пользователя; указывает, что, когда программа (файл) выполняется, идентификатор пользователя устанавливается равным идентификатору владельца этого файла, а не пользователя, запустившего этот файл на исполнение; 2000 - бит установки идентификатора группы; указывает, что на время выполнения программы (файла) идентификатор группы устанавливается равным идентификатору группы, соответствующему групповой принадлежности этого файла; 1000 - бит разделения; указывает, что выполняемая программа (файл) разделяется многими пользователями и свопинговое пространство не сбрасывается, даже если никто программу не использует в данный момент.

Установка обоих битов идентификаторов пользователя и группы позволяет пользователю выполнять такие программы, которые должны иметь полномочия суперпользователя (например, программа mail создает каталог /usr/spool/mail). В противном случае возможности системы, доступные пользователю, были бы значительно ограничены.



Специальные символы в C-Shell


Стандартным знаком подсказки является процент (%). При желании его можно заменить.

Восклицательный знак (!) выполняет многие специальные функции, в частности (!!) означает вызов предыдущей команды.

Знак крышка (^) используется для разделения строк при коррекции части текста предыдущей команды.

Знак тильда (~) в качестве префикса имени пользователя расширяет его до полного имени его рабочего каталога.

Фигурные скобки ({ }) группируют список имен файлов в группу имен файлов.



Спецпользователи


Это пользователи, выполняющие действия над системой, недоступные обычным пользователям. Один из них, имеющий неограниченные полномочия, называется суперпользователем и имеет обычно имя root. Разные системы могут иметь и других спецпользователей, например, пользователя с именем bin, обладающих меньшими полномочиями, чем суперпользователь.

Имеются команды, которые может выполнить только суперпользователь, в частности, установка даты командой date, монтаж файловой системы командой mount, создание специальных файлов командой mknod и другие.

Стать суперпользователем можно несколькими способами.

Первый - загрузить систему в режиме единственного пользователя. Другой, применяемый на многопользовательской системе - выполнить команду su (superuser). Администратору системы рекомендуется входить в систему как обычному пользователю, и только в случае необходимости становиться временно суперпользователем по команде su.



Средства оценки эффективности исполнения программы


Имеются средства, позволяющие выяснить, сколько времени и места требуется для выполнения программы и ее частей. Эти средства полезны для сравнения качества реализации программы на разных языках программирования или в разных версиях системы UNIX.

Команда time позволяет выяснить три значения потраченного на решение указанной программы времени в секундах: реального, равного времени, замеренному по секундомеру, зависящего от количества пользователей в данный момент; пользовательского, равного времени счета программы по командам пользователя, и системного, равного времени системы при обслуживании этой программы. Команда time в Shell и в C-Shell имеет разные формы выдачи.

Пример (в Shell):

$ time test real 30.0 user 27.6 sys 0.5 $

Команда size показывает размер памяти в байтах трех различных частей программы: выполняемого кода (называемого текстом), области инициируемых данных и области неинициируемых данных.

Пример:

$ size test 1356 + 260 + 613 = 2226 b = 004265 b

Общий размер программы test равен 4265 байтов.

Если имя оцениваемого файла отсутствует, подразумевается a.out.

Для программы на языке C есть более тонкое средство, позволяющее получить профиль программы, показывающий для каждой подпрограммы долю времени ее выполнения в процентах (%time), суммарное время ее выполнения в секундах (cumsecs), количество ее вызовов (# call) и время, потраченное на один вызов в миллисекундах (ms/call). Для получения профиля следует перетранслировать программу с ключом -p (профиль), а после запуска программы, во время которого статистическая информация будет собрана в файле mon.out, выполнить команду prof для обработки указанного файла.

Пример:

$ cc -p program.c $ mv a.out program $ program $ ls mon.out program program.c $ prof program name % time cumsecs # call ms/call conv 58.6 11.38 2000 5.69 strcat 30.1 9.50 100 95.0 main 1.1 2.1 1 2.1 . . . . . . . . . . . . . . . . . . . . . atoi 0.0 0.1 1 0.0



СРЕДСТВА РАЗРАБОТКИ ПРОГРАММ


Система UNIX обеспечивает богатый набор средств для разработки программ, включающий компиляторы, линкер, символьный отладчик, средства ведения программных проектов и разработки языковых процессоров, архивные средства и другие.



Средства реализации языков программирования


До сих пор речь шла о разработке программ на языках программирования, реализованных в системе (т.е. имеющих компилятор и линкер). Если вас, как опытного пользователя, не устраивают эти предопределенные языки и вы хотите реализовать свой язык, то и в этом вам поможет система UNIX, предоставляя утилиты lex и yacc.

Утилита lex является текстовым процессором, реализующим лексический анализ, необходимый при создании компиляторов и других языковых процессоров.

Утилита yacc (yet another compiler compiler) конвертирует безконтекстную грамматику в таблицы, управляющие грамматическим разбором посредством LR(1)-автомата. Формируемые при этом правила предшествования позволяют избавиться от двусмысленностей исходной грамматики.

Совместное использование утилит lex и yacc является мощным подспорьем для быстрой реализации языковых процессоров в среде системы UNIX [9,10,11].



СРЕДСТВА РЕДАКТОРА EX, ДОПОЛНЯЮЩИЕ ВОЗМОЖНОСТИ РЕДАКТОРА VI


Как уже говорилось, редактор vi тесно связан с редактором ex, являясь по сути одним из режимов работы последнего. Поэтому ряд мощных команд, реализованных в ex, можно и полезно выполнять и из редактора vi.



Ссылка на рабочий каталог пользователя


Знак тильда (~) используется в C-Shell для ссылки на собственный рабочий каталог или рабочий каталог другого пользователя, указанного именем пользователя.

Примеры:

% cd progs % mv ~/test.c

Последняя точка означает текущий каталог progs. Чтобы узнать, что же в действительности выполнено, посмотрим буфер истории:

% !h . . . . . . . . . . . . . . 11 mv /users/wowa/empire.c space.c 12 cd progs 12 mv /users/peter/test.c .

Пусть имеется пользователь с именем nick. Чтобы узнать его рабочий каталог, можно использовать команду echo и средство знака тильда:

% echo ~nick /users/nick %



Стандартные файлы


Многие команды работают по умолчанию со стандартными файлами:

Standard Input(S.I.); Standard Output (S.O.); Diagnostic Output(D.O.);

Однако есть средства изменения умолчания, т.е. возможность указать другие файлы вместо стандартных. Можно также в качестве D.O. использовать S.O. Эти средства называются перенаправление (редирекция) ввода и вывода.



Стандартные файлы в C-Shell


Когда вы входите в C-Shell, он ищет в вашем рабочем каталоге файлы .login и .cshrc. Если такие файлы у вас есть, он выполняет все команды, расположенные в них. Файл .login используется только при входе в C-Shell с терминала; .cshrc - при любом входе.



СТРУКТУРА ИНФОРМАЦИИ О ФУНКЦИЯХ UNIX


Руководство UNIX Reference Manual содержит 8 секций:

Commands - команды; System calls - системные вызовы; Subroutines - подпрограммы; Special files - спецфайлы; File format and convension - формат файлов и соглашения; Games - игры; Macro packages and language Conventions - макропакеты и языковые соглашения (для обработки текстов); Administrator commands and procedures - команды и прцедуры администратора.

Описание команды состоит из следующих разделов:

NAME - имя и функция; SYNOPSIS - синтаксис; DESCRIPTION - описание функции; FILE - используемые файлы; SEE ALSO - смежные команды; DIAGNOSTIC - ответы на ошибки; BUGS - замеченные некорректности.

Все руководство UNIX Peference Manual хранится в системе на диске и может быть напечатано на экране или принтере в любое время командой:

$ man i <имя>

например:

$ man grep

где i - номер секции; если i опущено, подразумевается i=1.



Структура корневого каталога


Как правило, корневой каталог имеет следующую структуру, но администратор системы может изменять эту структуру.

Каталоги можно посмотреть командой ls:

$ ls -l /bin - часто используемые команды;

$ ls -l /bin/bin - редко используемые команды;

$ ls /dev - драйверы устройств;

$ ls /users - каталоги пользователей.



Структурные операторы Shell


Кроме процедур, в языке Shell имеются структурные операторы типа "if-else" и "while-do". Программирование на Shell, кроме написания процедур, используется для:

отработки алгоритма перед кодированием его в языках С или ФОРТРАН-77 (нет компиляции, линкирования, загрузки, простота отладки); обучения принципам программирования непрограммистов.



СВЯЗЬ ПОЛЬЗОВАТЕЛЬ-ПОЛЬЗОВАТЕЛЬ


Система UNIX предполагает возможность коллективной работы и кооперации пользователей. Это требует развитых средств связи пользователей между собой. В системе имеются следующие средства: - команда write для непосредственной посылки сообщения другому пользователю; - средство mail, реализующее электронную почту.



Трансляция знаков (tr)


Утилита tr работает со стандартным вводом и имеет два аргумента, задающие упорядоченные множества знаков, в которых каждый знак первого множества заменяется соответствующим знаком второго.

Пример:

$ tr a-z A-Z < people MARY CLARK 101 HENRY MORGAN 112 BILL WILLIAMS 100 $

Ключ -d позволяет задать множество символов, которые будут уничтожены.

Например:

$ tr -d 0-9 < people Mary Clark Henry Morgan Bill Williams $



Удаление файлов командой rm


rm удаляет файл из каталога и уничтожает его:

$ cd progs/c $ rm motd $ ls message (нет motd)

Можно удалить одной командой rm несколько файлов. Есть интерактивный вариант, требующий подтверждения на каждый файл (ключ -i):

$ rm -i file1 file2 file1 : n (no - нет)

file2 : y (yes - да)

Можно форсировать уничтожение ключом -f (даже если файл защищен по записи): -f и -i взаимно исключают друг друга.

$ rm -f stdio.h.

Однако этими средствами нельзя уничтожить каталог, пока не уничтожены все файлы. Это можно сделать рекурсивно: ключ -r (уничтожить все поддиректории)

$ rm -r progs.

Вариант:

$ rm -r * - уничтожить все поддерево.



Уничтожение пустого каталога: rmdir


Пустой каталог удаляется (remove directory):

$ rmdir progs [rmdir:progs not empty] - сообщение, если каталог не пуст.



Управление операционной системой


Средства управления операционной системой (ОС) аппаратно-зависимы, однако приводимое ниже описание этих средств является довольно типичным случаем.

Операционная система хранится на дисковом томе в некотором заданном формате. Для задания формата используется команда (System III - /lbin/init) инициализации тома с одним обязательным параметром - именем спецфайла для устройства, на котором находится инициализируемый том. Остальные необязательные параметры могут указать размер логического блока - единицы передачи данных между томом и оперативной памятью и размер загрузочной области в байтах (при отсутствии их значения выбираются по умолчанию).

Каждый том имеет одну загрузочную область, содержащую целое, возможно нулевое, число логических блоков. Загрузочная область полностью находится вне какой-либо файловой системы.

Изменение ее размера возможно только путем переинициализации тома.

Каждая загрузочная область может содержать только одну ОС (или часть одной ОС).

ОС состоит из последовательности кодовых сегментов, расположенных в загрузочной области одного или нескольких томов, причем граница между томами может быть внутри некоторого сегмента. ОС хранится в загрузочном формате.

Помимо загрузочной области, ОС может располагаться также в ряде обычных файлов, каждый из которых содержит целое число кодовых сегментов, заканчивающихся двумя нулевыми байтами. Этот формат не является загрузочным, однако он может быть преобразован в загрузочный командой (System III - /lbin/oscp).

Содержимое загрузочной области в действительности состоит из одного или нескольких ОС-файлов. Каждый ОС-файл начинается с заголовка, содержащего флаг загружаемости, номер тома, число томов, занятых операционной системой. Системный загрузчик загружает ОС-файл только в том случае, если флаг установлен в состояние загружаемости. Установку состояния флагов ОС-файлов можно выполнить специальной командой (System III - /lbin/osmark) с параметром, указывающим имя спецфайла для устройства, на которое поставлен том с загрузочной областью. Ключ в этой команде устанавливает флаг в соcтояние загружаемости или незагружаемости.

Упомянутая выше команда /lbin/oscp (System III) позволяет выполнить следующие работы по копированию сегментов ОС:




копировать ОС из одной ( или более) загрузочных областей тома (томов) в загрузочную область другого тома; копировать ОС из обычных файлов в ОС-файлы для создания (опция -m, merge) или модификации (опция -a, add) ОС в загрузочной области; копировать ОС-файлы в обычные файлы для разделения ОС на части (опция -s, split) или в один обычный файл (опция -f).

Для проверки целостности ОС в загрузочной области, а также для контроля добавленных сегментов можно выполнить команду lbin/osck (System III), например:

osck -v /dev/rhd

Опция -v вызывает печать списка имен всех сегментов ОС.

Команда проверяет корректность:

заголовков ОС-файлов; списка сегментов; контрольной суммы каждого сегмента.

Первоначальная установка ОС или части ОС выполняется командой optinstall, а модификация версии ОС - командой optupdate. Эти команды следует выполнять в однопользовательском режиме и завершать перегрузкой системы. Данные для установки или модификации версии ОС расположены на дистрибутивном томе (обычно кассетная лента или гибкий диск). Параметром обеих команд является имя (номер) устанавливаемого или модифицируемого программного продукта.

Наконец, имеется возможность загружать несколько разных ОС (или версий одной ОС), используя одну загрузочную область на системном диске (/dev/rhd). Это выполняет команда /lbin/chsys (change system), являющаяся командным файлом. Внутри командного файла chsys используются команды oscp для перестройки загрузочной области для новой ОС чтением ее сегментов из обычных файлов, osck для последующей проверки загрузочной области. Так как chsys не проверяет, все ли пользователи закончили работу, рекомендуется перед ее выполнением выполнить команду shutdown.




Управляющие структуры скриптов


Допустимые в C-Shell управляющие структуры взяты из языка C. Напомним, что скрипт в C-Shell должен начинаться с символа # (диез). Этим же символом вводится комментарий, продолжающийся до конца строки.



Условный оператор if


Используем имена переменных, представляющие значения параметров процедуры:

sort +1 -2 $1 | tr ... | lpr

Пример неверного вызова:

makelist (без параметров) , где $1 неопределен.

Исправить ошибку можно, проверяя количество аргументов - значение переменной $# посредством if - оператора.

Пример: (измененной процедуры makelist):

if test $# -eq 0 then echo "You must give a filename" exit 1 else sort +1 -2 $1 | tr ... | lpr fi

Здесь test и exit - команды проверки (см. раздел 7.11) и выхода.

Таким образом, синтаксис оператора if:

if <если эта команда выполняется успешно, то>; then <выполнить все следующие команды до else или, если его нет, до fi>; [else <иначе выполнить следующие команды до fi>]

Ключевые слова if, then, else и fi пишутся с начала строки. Успешное выполнение процедуры означает, что она возвращает значение true = 0 (zero) (неуспех - возвращаемое значение не равно 0).

Оператор exit 1 задает возвращаемое значение 1 для неудачного выполнения makelist и завершает процедуру.

Возможны вложенные if. Для else if есть сокращение elif, которое одновременно сокращает fi.



Установка и изменение режима доступа к файлу: chmod


Формат команды chmod (change mode) для установки режима:

chmod <режим> <файлы>

Пример:

$ chmod 644 f1 f2 f3

где 644 соответствует rw-r--r--

Формат команды chmod для изменения режима:

chmod <изменения> <файлы>

В изменениях используются обозначения:

u - user r - read

g - group w - write

o - other x - execute

a - all

= - назначить

+ - добавить

- - отнять

Пример:

$ ls -l -r-------- ... f1 -r-------- ... f2 -r-------- ... f3 $ chmod a = r, u + w f1 f2 f3 или (эквивалентный вариант изменения прав доступа)

$ chmod u = rw, go = r f1 f2 f3 $ ls -l -rw-r--r-- ... f1 -rw-r--r-- ... f2 -rw-r--r-- ... f3 $ chmod o-r f1 f2 f3 $ ls -l -rw-r----- ... f1 -rw-r----- ... f2 -rw-r----- ... f3,

Другие пользователи, не входящие в группу, потеряли право читать файлы.



Установка переменной Shell выводом из команды


Пример 1:

$ now = `date` (где `` - обратные кавычки)

$ echo $now Sun Feb 14 12:00:01 PST 1985 $

Пример 2: (получение значения переменной из файла):

$ menu = `cat food` $ echo $menu apples cheddar chardonnay (символы возврата каретки заменяются на пробелы).



Устройства и специальные файлы


Каждому устройству соответствует часть системы, называемая драйвером. Связь между устройствами и драйверами отражена в каталоге /dev, вхождения которого принято называть специальными файлами, или спецфайлами. Это позволяет называть каждое устройство именем некоторого спецфайла.

Добавление устройства в систему требует и добавления спецфайла в каталоге /dev. Последнее реализуется командой mknod (make node - сделать узел). Пример:

ls -l /dev ___________ crw--w--w-1 root 0 0 .....console brw-rw-rw-1 root 5 0 .....fl0 ___________ crw-w--w-1 root 18 0 .....tty0 crw-w--w-1 mary 18 1 .....tty1 /etc/mknod /dev/tty2 c 18 2

Первый аргумент команды mknod задает имя спецфайла для подключаемого устройства. Второй аргумент указывает, является ли устройство знакоориентированным (c) или блочным (b), в зависимости от единицы передаваемых данных. Оставшиеся два аргумента называют мажорным и минорным номерами устройства. Их значения зависят от аппаратной реализации, но, как правило, первый аргумент указывает тип устройства, а второй - адрес экземпляра устройства данного типа.



Версии Shell


Shell - интерпретатор команд, подаваемых с терминала или из командного файла. Это обычная программа (т.е. не входит в ядро операционной системы UNIX). Ее можно заменить на другую или иметь несколько.

Две наиболее известные версии:

Shell (версии 7 UNIX) или Bourne Shell (от фамилии автора S.R.Bourne из фирмы Bell Labs) [5]; C-Shell (версии Berkley UNIX).

Они похожи, но есть и отличия: C-Shell мощнее в диалоговом режиме, а обычный Shell имеет более элегантные управляющие структуры.

Shell - язык программирования, так как имеет:

переменные; управляющие структуры (типа if); подпрограммы (в том числе командные файлы); передачу параметров; обработку прерываний.



Версии UNIX


Основные версии:

версии 6, 7, III, V Bell Labs AT&T (16 р, 32 р - ЭВМ); версия 4.2, 4.3 Калифорнийского университета (32 р - VAX, SUN).

Система работает на десятках типов ЭВМ: серия DEC PDP (СМ), серия DEC VAX, Honeywall 6070, семейство IBM/370 (ЕС ЭВМ), Amdahl 470, Perkin Elmer, Zilog Z8000, рабочие станции на базе Motorola MC 68000, серия HP 9000 , персональные компьютеры на базе Intel 286,386,486 и других.



Владелец файла и защита файла


Каждый файл и каталог имеют владельца - обычно это пользователь, создавший их в первый раз. Владелец может затем назначить защиту файла со стороны трех классов пользователей:

владелец (сам); группа - пользователи этой же группы, где владелец; остальные - все, имеющие доступ к системе.

Каждый файл имеет 3 вида разрешения на доступ:

чтение (r) read - можно читать (смотреть) содержимое файла или каталога (читать с ключом -l в ls); запись (w) write - можно менять содержимое файла или каталога (создавать или удалять файлы в каталоге); выполнять (x) execute - использовать файл как команду UNIX и искать (search) в каталоге.

Все комбинации трех видов разрешения доступа для трех классов пользователей (9 комбинаций) записываются в формате (если все права есть)

rwx rwx rwx или 777 - - - Владелец - - Группа - Остальные

Отсутствие права доступа указывается минусом:

r--r--r- или 444

Пример:

$ ls -l /bin -r-xr-xr-x 1bin 1986 Nov.26 12:00 ar ...

Эта команда показывает режимы доступа.



Ввод в командах скрипта


Обеспечение ввода в командах скрипта в C-Shell из потока символов текста скрипта вместо стандартного ввода (используемого по умолчанию), потребовало введения специального синтаксиса. Рассмотрим пример скрипта:

# foreach i ($argv) ed -$i << 'STOP' 1, $s/wine/water/g w q 'STOP' end

Строка 'STOP', появляющаяся в тексте скрипта дважды, является меткой, ограничивающей текст ввода, и означает, что стандартный ввод для команды ed заменяется посредством механизма перенаправления (знак <<) вводом текста из файла самого скрипта. Ограничитель 'STOP' заключен в кавычки, чтобы предотвратить подстановку переменных и команды внутри него.

В примере редактор 4d выполняет глобальную подстановку всех вхождений строки wine на строку water (см. раздел 12.4).



Выход из редактора ex


Выход из редактора ex в режим команд системы выполняется командой q, например:

: q

Если буфер редактирования не был записан или еще не все файлы отредактированы, выдается предупреждение, которое можно обойти, подавая q с восклицательным знаком:

: q!

Команду выхода можно для удобства комбинировать с командой записи, например:

: wq или

: wq!

если есть препятствия для записи или выхода.



Выход из vi


Если вы хотите запомнить изменения:

Esc : w q ! Enter

(нажать на клавишу Esc, ввести двоеточие - оно появится в нижней части экрана, ввести символы w, q и восклицательный знак, нажать на клавишу Enter).

Если нет:

Esc : q ! Enter



Выход из vi в ex


Для выхода из vi в ex надо нажать клавишу Esc для перехода в командный режим, если вы были в режиме текста, а затем нажать клавишу : (двоеточие). Будет напечатана подсказка редактора ex - двоеточие, приглашающая вводить команды редактора ex.



Выполнение арифметических операций expr


Команда expr вычисляет значение выражения, поданного в качестве аргумента и посылает результат на стандартный вывод. Наиболее интересным применением является выполнение операций над переменными языка Shell.

Пример суммирования 3 чисел:

$ cat sum3 expr $1 + $2 + $3 $ chmod 755 sum3 $ sum3 13 49 2 64 $

Пример непосредственного использования команды:

$ expr 13 + 49 + 2 + 64 + 1 129 $

В expr можно применять следующие арифметические операторы: +, -, *, /, % (остаток). Все операнды и операции должны быть разделены пробелами.

Заметим, что знак умножения следует заключать в кавычки (одинарные или двойные), например: '*', так как символ * имеет в Shell специальный смысл.

Более сложный пример expr в процедуре (фрагмент):

num = 'wc -l < $1' tot = 100 count = $num avint = 'expr $tot / $num' avdec = 'expr $tot % $num' while test $count -gt 0 do ...

Здесь wc -l осуществляет подсчет числа строк в файле, а далее это число используется в выражениях.



Выполнение команды системы внутри редактора ex


Для этого используется префикс ! (восклицательный знак), например:

: !cc % ,

где % - ссылка на имя текущего редактируемого файла.

Два восклицательных знака:

: !!

повторяют предыдущую команду.



Выполнение процессов с низким приоритетом


$ nice nroff doc > doc.fmt & 2099 $

Задается выполнение процесса с меньшим приоритетом. Начальное значение nice равно 20; параметр добавления в команде nice по умолчанию равен 10; итого nice = 30. Приоритет тем выше, чем меньше nice. Или:

$ nice -5 nroff doc > doc.fmt &

Здесь параметр добавления задан явно, nice будет равен 25, то есть приоритет будет на 5 единиц выше, чем по умолчанию.

nohup (no hang up) - нечувствительность к разъединению телефонной линии, на которой "висит" standard output)

$ nohup nroff doc & 2176 $ Sending output to nohup.out (замена standard output при разрыве линии)

совместное использование:

$ nice nohup nroff doc > doc.fmt &



Выражение в скриптах


Допускается использование выражений над переменными по правилам операций в языке C. Например, операции '==' и '!=' сравнивают строки, операции '&' и '-' реализуют булевские операции 'и' и 'или' и так далее. Введены также специальные операции '=~' и '!~', подобные операциям '==' и '!=', однако в правой строке допускаются метасимволы C-Shell (*, ? и []).

Кроме того, допустимы выражения для оценки состояния файла (см. раздел 8.13).

Результат выполнения предыдущей команды (нормальное или аварийное завершение) можно получить в виде значения переменной

$status (ноль - без ошибок, не ноль - авария).



Вызов компиляторов


В системе UNIX имеются компиляторы с языков C, ФОРТРАН-77 и ПАСКАЛЬ и другие. Команды вызова компилятора имеют вид cc, f77 или fc, pc и т.п.

Параметрами этих команд являются файлы с текстами программ на исходных языках, имена которых должны оканчиваться на .c, .f, .p и т.п. соответственно.

Примеры:

$ cc program.c $ fc test.f $ pc example.p

Результатом работы компилятора является файл исполняемого кода, имеющий по умолчанию имя a.out. Если вы хотите другое имя, его можно указать явно ключом -o <имя> при вызове компилятора.

Пример:

$ fc -o test test.f $ ls test test.f $



Вызов на редактирование следующего или нового файла


Если редактор был вызван для редактирования нескольких файлов, например:

$ vi .*, или

$ ex *.c,

то переход к редактированию следующего файла выполняется командой n (next):

: n

Командой e (edit) можно вызвать на редактирование произвольный файл, указанный именем

: e another

Если в момент подачи команд n или e буфер редактирования предыдущего файла не был записан, выдается предупреждение, которое можно обойти, форсировав выполнение команд подачей восклицательного знака : n! и : e! соответственно.



Вызов vi


$ vi myfile (одно или несколько имен файлов через пробелы для последовательного вызова их на редактирование).

Если такого файла нет, то появится начало пустого файла; курсор - в начале первой строки.

$ vi + myfile

На экране - конец файла; курсор - в начале последней строки.

$ vi +10 myfile

На экране - часть файла и строка 10 - в центре экрана; курсор - в начале этой строки.



Загрузка и выключение системы


Загрузка требуется, когда на ЭВМ только что включили питание. Обычно процесс загрузки в большей или меньшей степени автоматизирован и заключается в последовательном вызове программ, каждая из которых загружает и запускает следующую.

Первая программа, самая простая, загружена всегда и запускается при включении питания ЭВМ автоматически или вручную.

В процессе загрузки может потребоваться ответить на вопросы системы, например, касающиеся устройства, на котором находится загружаемая система. В завершение процесса загрузки система выполняет командный файл /etc/rc, который, вообще говоря, может содержать любые команды, но обычно содержит команды для выполнения следующих действий:

демонтаж старых файловых систем; монтаж новых файловых систем; удаление старых журнальных учетных файлов; удаление временных файлов; запуск процессов update и cron.

Выключение многопользовательской системы производится выполнением командного файла /etc/shutdown, который в типичном случае выполняет следующие действия:

посылает предупреждающие сообщения всем активным пользователям командой wall; убивает все процессы, кроме процесса консоли; очищает все буферы обменов с файлами командой sync; демонтирует файловые системы; выполняет, если надо, процедуры копирования данных; выключает питание ЭВМ, если позволяет аппаратура; в противном случае, питание выключается вручную.