Оператор while
Оператор цикла while имеет синтаксис:
while (<выражение>) <команда 1> <команда 2> .......... end.
Внутри цикла допустимы операторы break и continue (см.foreach).
Определение типа файла
Применяется команда file:
$ file /bin/ls /usr/bin etc/passwd usr/include/stdio.h /bin/ls: pure executable - исполняемый;
/usr/bin: directory - каталог;
/etc/passwd: ascii text - текст в коде ASCII;
/usr/include/stdio.h:C program text - текст C-программы.
Основные свойства UNIX
Мультизадачность: несколько задач, или процессов; в частности, возможны процессы "заднего плана" (back ground); от них не надо ждать ответа, чтобы продолжать что-нибудь делать (на их фоне).
Многопользовательская система - это следствие предыдущего свойства:
Останов процесса
$ kill 2042 (убить процесс с PID = 2042)
или
$ kill - 9 2042 (сигнал номер 9 безусловного останова;
другие сигналы из интервала (1,15),посылаемые системой задаче, можно блокировать, написав соответствующую реакцию).
Останов выполнения команды
^C или клавиша BREAK (не работает по линиям связи).
Отладка процедур Shell
Имеются три средства, позволяющие вести отладку процедур.
Размещение в теле процедуры команд echo для выдачи сообщений, являющихся трассой выполнения процедуры. Опция -v (verbose = многословный) в команде Shell приводит к печати команды на экране перед ее выполнением. Опция -x (execute) в команде Shell приводит к печати команды на экране по мере ее выполнения с заменой всех переменных их значениями; это наиболее мощное средство.
Отмена последней подстановки
Отмена последней подстановки выполняется командой u (undo). Реализация команды u выполняется обратной подстановкой, поэтому повторная подача команды отменяет первую команду u.
Параллельный стандартный вывод и перенаправление вывода
Схема такова:
Пример:
$ ls -l | tee dirconts на экран, то есть дублирование стандартный вывод вывода в файл
Печать файла
Простейший способ печати - это перенаправление стандартного вывода команды cat на терминал, имеющий устройство печати.
Например:
$ cat file > /dev/lp.
Однако не все терминалы имеют собственное устройство печати. В случае общего устройства печати система обеспечивает его коллективное использование, при котором заявка на печать, заставшая устройство занятым, ставится в очередь до момента освобождения устройства, после чего ее требование удовлетворяется автоматически. В этом случае используется команда lpr или lp.
Например:
$ lpr file1 file2 file3
Имеются также команды просмотра очереди заявок на печать lpstat и удаления заявки из очереди (cancel). Команды lpr и lp не обеспечивают разбиение печати на страницы. Это может быть сделано командой pr подготовки (prepare) файла для постраничной печати, которая предшествует печати.
Пример:
$ pr myfyle | lpr.
Размеры страницы по умолчанию равны 66 строкам (длина - length) по 72 знака (ширина - width). Ключами -w и -l можно задать другие размеры.
Примеры:
$ pr -w 132 -h"Conversion program" conv.c | lpr $ pr -l 25 addr | lpr
Ключ -h (head) вводит заголовок печати. Двойные кавычки требуются при наличии в заголовке пробелов, иначе они могут быть опущены.
Печать рабочего каталога
Узнать его имя можно так:
$ pwd (print working directory)
/users/mary
Выводится полное имя рабочего (текущего) каталога /users/mary, где users - имя охватывающего каталога в иерархии каталогов ФС. Еще один охватывающий каталог root подразумевается по умолчанию (корневой главный каталог):
root/users/mary = /users/mary.
Изменение текущего каталога можно сделать командой cd, рассматриваемой позже.
Печать содержимого файла
Команда cat (от concatenate) - сцепить несколько (или один) файлов и направить результат на стандартный вывод (Standart Output), обычно на экран дисплея.
Пример:
$ cat /etc/motd - посмотреть файл (message of today)
The system will down at 17:00.
Этот файл, создаваемый администратором для текущих объявлений, обычно печатается автоматически при входе в систему (login). Если Вы забыли его содержание, можно напечатать еще раз как в примере.
Печать содержимого каталога
$ ls - печать текущего каталога;
$ ls -al -a(all) - все файлы и подкаталоги;
-l(long) - полную информацию;
$ ls / - печать каталога root;
$ ls -l / - печать каталога root полная.
Переход в режим редактора vi
Выполняется командой vi, которой может предшествовать номер строки, высвечиваемой в начале экрана, например:
: 10 vi
В режиме vi доступны все средства редактора. Выход из режима vi выполняется подачей команды Q (большое).
Переменные Shell
В языке Shell версии 7 определение переменной содержит имя и значение:
var = value.
Доступ к переменной - по имени со знаком $ спереди:
fruit = apple (определение);
echo $fruit (доступ);
apple (результат echo).
Таким образом, переменная - это строка. Возможна конкатекация строк:
$ fruit = apple $ fruit = pine$fruit $ echo $fruit pineapple $ fruite = apple $ wine = ${fruite}jack $ echo $wine applejack $
Другие способы установки значения переменной - ввод из файла или вывод из команды (см. раздел 7.6), а также присваивание значений переменной - параметру цикла for из списка значений, заданного явно или по умолчанию (см. раздел 7.9).
Переменная может быть:
Частью полного имени файла: $d/filename, где $d - переменная (например, d = /usr/bin). Частью команды:
$ S = "sort + 2n + 1 - 2" (наличие пробелов требует кавычек "")
$ $S tennis/lpr $ $S basketball/lpr $ $S pingpong/lpr $
Однако внутри значения для команды не могут быть символы |, >, <, & (обозначающие канал, перенаправления и фоновый режим).
Переменные Shell - аргументы процедур
Это особый тип переменных, именуемых цифрами.
Пример:
$ dothis grapes apples pears (процедура).
Тогда позиционные параметры (аргументы) этой команды доступны по именам:
$1 = `grapes` $2 = `apples` $3 = `pears`
и т.д. до $9. Однако есть команда shift, которая сдвигает имена на остальные аргументы, если их больше 9 (окно шириной 9).
Другой способ получить все аргументы (даже если их больше 9):
$* , что эквивалентно $1$2 ...
Количество аргументов присваивается другой переменной: $# (диез). Наконец, имя процедуры - это $0; переменная $0 не учитывается при подсчете $#.
Переменные в C-Shell
Подобно языку Shell, C-Shell имеет встроенные переменные, установка которых может влиять на поведение интерпретатора. Установка значения переменной производится командой set, имеющей следующий синтаксис:
set <переменная> = <значение>
Рассмотрим наиболее употребительные встроенные переменные.
Переменная history задает количество предыдущих команд, сохраняемых в буфере истории, например:
set history = 30.
Переменная path устанавливает каталоги для поиска команд. Список каталогов, разделенных пробелами, заключается в скобки:
set path = (/bin /usr/ucb $Home/bin .)
Переменная prompt задает строку подсказки перед выполнением очередной команды. При этом символы \ ! (обратный слэш и восклицательный знак) в строке подсказки задают текущий номер команды, используемый в механизме истории.
Пример:
% set prompt = "ed \ ! >" ed5> history . . . . . . . . 5 history
Переменная Shell указывает, какой интерпретатор вы хотите в качестве начального. Возможные значения: /bin/csh или /bin/sh.
Булевская переменная noclobber используется для защиты уже существующего файла от случайной потери путем перезаписи в него при перенаправлении стандартного вывода. Для этого ее надо установить в значение "истина":
% set noclobber % fgrep ounds /usr/dict/words > shells Shells: File exists - (файл с именем shells уже существует и его текущая версия была бы потеряна). Если вы тем не менее хотите перезаписать этот файл, используйте перенаправление с восклицательным знаком (>!):
% fgrep ounds /usr/dict/words >! shells
В этом случае перезапись состоится. Установка булевской переменной в противоположное значение "ложь" выполняется командой:
unset noclobber.
Переменные home и cwd, устанавливаемые автоматически, равны полным именам собственного и текущего каталогов соответственно.
Переменная status автоматически возвращает нулевое значение, если текущая команда завершена без ошибок. Ненулевое значение указывает ошибочное завершение.
Переменная argv содержит аргументы командной строки с нумерацией аргументов следующим образом: argv [0] - команда, argv [1] - первый аргумент и так далее (как в языке C).
Доступ к переменным обеспечивается ссылкой на имена с предшествующим знаком $, например, $cwd $argv [0] и т.д.
Посмотреть текущие значения встроенных переменных можно командой set без параметров:
% set
Пользователь может определить свои переменные типа строка знаков. Например:
% set wd = `pwd` % echo $wd /users/sys/docs.
Здесь результат выполнения команды pwd (строка полного имени рабочего каталога пользователя) присвоен переменной wd, значение которой проверено командой echo.
Кроме строковых переменных можно определить числовые переменные, принимающие значения типа целое, вещественное или булевское. Целое и вещественное значение начинающееся с нуля, считается восьмеричным, иначе - десятичным. Установка значения числовой переменной выполняется командой @ (аналог set для строковых переменных).
Пример:
% @ sum = (1 + 4) % echo $sum 5
В общем случае синтаксис команды @ такой:
@ <переменная> <C-операция> <C-выражение>,
где C-операция - один из операторов присваивания, принятых в языке C (=, +=, -=, *=, /=, %=), а C-выражение - выражение в синтаксисе языка C.
Перенаправление стандартного ввода
Используется знак <.
Пример:
$ mail - ввод сообщения с экрана;
$ mail < message - ввод сообщения из файла message.
Эта возможность используется реже, чем перенаправление вывода.
Тривиальный случай перенаправления ввода:
$ cat < this_file $ cat this_file
Это две эквивалентные команды.
Можно одновременно перенаправить и ввод, и вывод.
Например:
$ cat < left > right.
Будьте осторожны: надо, чтобы left не равнялось right, иначе можно (вообще говоря) потерять входной файл. Безопаснее >>, чем > (добавление, чем запись).
Перенаправление стандартного вывода
Используется знак >:
$ ls -l - вывод на экран = standard output;
$ ls -l > dirconts - вывод в файл dirconts;
$ cat dirconts - вывод на экран.
Пробелы вокруг символа > необязательны.
Возможна перенаправление вывода с добавлением (с дописыванием в файл): обозначается >>:
$ pwd >> dirconts (добавить в файл имя текущего каталога).
Перенос и переименование файлов командой mv
Эта команда переносит файл или каталог из одного места файловой системы в другое. Побочный эффект - переименование (если исходный и конечный каталоги совпадают).
Отличие от копирования: исходный файл пропадает.
Пример:
$ mv message mesg $ ls mesg ....
Если файл назначения защищен от записи, то система печатает режим доступа и спрашивает подтверждение переноса.
Пример:
$ cp message mesg $ chmod 444 message - только чтение
$ mv mesg message message: mode 444? y
Второй аргумент может быть каталогом, тогда файл переносится под тем же именем:
$ mv message progs/c $ cd progs.c $ ls message ....
Как и в случае cp может быть перенесено несколько файлов, если "второй" аргумент - каталог.
Перестановка части текста (cut-paste)
Часть текста сохраняется в буфере редактора, затем вставляется в другое место или в несколько мест (если вставка повторяется). Буфера могут быть именованными и один - анонимный. При выполнении команд ndd (где n - число) удаляемые n строк попадают на некоторое время в неименованный буфер.
Содержание буфера можно вставить:
после текущей строчки командой p (put); перед текущей строчкой командой P (Put).
Следует помнить, что в анонимном буфере хранится последний уничтоженный текст, предыдущие - безвозвратно теряются! (Команды с (change) - тоже уничтожают буфер).
Периодическое выполнение заданий
Одной из команд, выполняемых в составе системного стартового командного файла /etc/rc начальным процессом, может быть команда /etc/cron, создающая постоянный процесс, пробуждающийся периодически каждую минуту. Этот процесс просматривает записи файла /usr/lib/crontab в поисках заданий, которые должны быть выполнены. Типичный файл crontab может выглядеть следующим образом (пример):
cat /usr/lib/crontab 0 0 * * * /etc/backup -fsck 0,15,30,45 2-23 * * * /usr/lib/atrun
Первые пять полей записи файла crontab означают минуты (0-59), часы (0-23), день месяца (1-31), месяц года (1-12) и день недели (0-6, 0 - воскресенье). В каждом из этих полей может быть значение, перечень значений, разделенных запятыми, или границы интервала значений, разделенные минусом; звездочка означает любое возможное значение. В данном примере первая запись соответствует ежедневному выполнению в полночь сброса и проверки файловой системы в течение всего года; вторая - выполнению программы запуска заданий, запланированных командой at, каждые 15 минут с 2 часов ночи до 11 часов вечера ежедневно в течение всего года.
Команда at планирует выполнение командного файла интерпретатора shell (shell-скрипта), указанного ее последним аргументом в момент времени, заданный ее первыми аргументами. Например:
at 2300 jun 16 scriptfile_1
Указанный файл будет выполнен в 11 часов вечера в указанный день текущего года. Точность времени запуска зависит от периода пробуждения постоянного процесса, выполняющего команду cron. Все действия процесса, выполняющего cron, фиксируются в учетном файле /usr/lib/cronlag, если он существует и открыт на запись в момент выполнения команды cron.
Команду at может запустить любой пользователь, чтобы оставить задание на ночное время.
Подключение терминалов
Все терминалы, которые могут быть подключены к системе, должны быть описаны в специальном файле, который имеет имя /etc/ttys (версия 7) или /etc/inittab.
Каждому терминалу соответствует одна строка файла. Форматы этих файлов сходны в том, что первый символ является цифрой, нулевое значение которой соответствует отключенному (логически) терминалу, а единичное - подключенному терминалу. Кроме того, формат обоих файлов предусматривает наличие имени спецфайла, соответствующего терминалу (второе поле в /etc/inittab).
Типичная строка в /etc/inittab имеет вид (пример):
1:t3:c:/etc/getty tty13 H 0
Первое поле имеет подполя, разделенные двоеточием.
При загрузке системы последним шагом загрузки является запуск начального процесса с номером 1, выполняющего команду /etc/init.
Команда init перед выполнением системного стартового командного файла /etc/rc просматривает файл etc/inittab. Для каждой строки этого файла, начинающейся с ненулевого символа, совпадающего с состоянием начального процесса (при запуске равного единице), команда init порождает второй процесс в цепочке (init-getti-login-shell). Порожденный процесс выполняет команду, указанную в четвертом подполе первого поля файла /etc/inittab (в данном примере /etc/getty).
Команда getty выдает на терминал, указанный именем спецфайла во втором поле файла /etc/inittab, содержимое файла /etc/issue, если он существует, и вслед за этим выводит на терминал текст подсказки из записи файла /etc/gettydefs, содержащем характеристики терминала (обычно login:). Затем getty читает имя пользователя и вызывает команду login, передавая ей имя пользователя в качестве параметра.
Команда login вводит пароль пользователя и после успешной проверки пароля выполняет команду из последнего поля записи данного пользователя в файле /etc/passwd (обычно /bin/sh или bin/csh), а также устанавливает в качестве текущего начальный каталог пользователя, указанный в предпоследнем поле записи данного пользователя в файле /etc/passwd.
Команда sh или csh командного интерпретатора выполняет стартовые файлы с предопределенными именами (.profile для sh; .cshrc и .login для csh), выводит подсказку и ждет ввода очередной команды пользователя.
По окончании сеанса (подачей команды logout или ^D), а также в случае неверного пароля управление возвращается в команду getty, которая перезапускается повторно, если в третьем подполе первого поля записи файла /etc/inittab для данного терминала стоит символ с (continually); если же в этом поле стоит пробел, то команда getty завершается.
Подсчет строк, слов, знаков в файле
Подсчет числа строк, слов и знаков в заданном файле выполняется командой wc.
Например:
$ wc people 3 9 51 people $
Ключи -l (lines), -w (words), -c (character) могут указать явно объекты счета.
Например:
$ wc -l people 3 people $ wc -lc people 10 51 people $
Подстановка образца текста
Подстановка образца текста выполняется командой s (substitute), в которой указывается искомый образец и заменяющий образец, например:
: s/eed/ace/ int space;
Эта команда выполняет замену первого вхождения искомого образца в текущей строке.
Для замены всех вхождений в строке надо добавить флаг g (global - глобальный) в конце команды:
: s/wine/water/g water = water + shugar
Чтобы выполнить подстановки в нескольких строках, надо добавить префикс адресации или поиска строк по образцу. Например:
: 1,10s/wine/water/g или
: 1, $s/wine/water/g
Примеры поиска по образцу:
: g/speed/s/eed/ace/g или
: g/speed/s//space/g.
В последнем случае искомый образец берется из буфера искомого образца.
Возможен интерактивный режим выполнения глобальной команды подстановки, при котором редактор для каждой найденной строки перед выполнением подстановки требует подтверждения ее необходимости в форме ввода буквы y (yes). Для интерактивной формы в команде требуется использовать ключ c (confirmation):
: g/eed/s//ace/gc int speed; ^^^ y real need; ^^^ d = speed x time; ^^^ y output (speed); ^^^ y
Здесь три замены произведутся, а одна - нет.
Поиск строк по образцу текста
Команда глобального поиска начинается префиксом g (для глобального поиска по всему тексту) и печатает все строки, содержащие предъявляемый образец, например:
: g/speed; int speed; d = speed x time; output (speed).
Образец может быть любой частью текста и запоминается в специальном буфере искомого образца, отличном от буфера все го текста. Если префикс g не указан, ищется и печатается первая найденная строка, начиная от текущей:
: /speed; int speed.
Поиск строк в файле по образцу (grep)
Утилита grep осуществляет поиск по одному или нескольким файлам и печатает все строки, содержащие предъявленный образец текста, на стандартном выводе.
В простейшем случае образец задается постоянной строкой знаков. В общем же случае он задается регулярным выражением (grep - акроним от global regular expression printer).
Пример:
$ grep Henry admpeople hardpeople softpeople Softpeople: Henry Morgan 112 $ или
$ grep Henry *people Softpeople: Henry Morgan 112 $
Ключ -v (invert) предписывает печать всех строк, кроме найденных, например:
$ grep -v "Henry Morgan" Softpeople Bill Williams 100 Mary Clark 101 $
Двойные кавычки требуются для размещения в образце пробелов.
Регулярные выражения позволяют вести поиск типа: найти все слова из четырех букв, начинающиеся на d, или все слова, кончающиеся на able, и тому подобное. Рассмотрим примеры задания образцов посредством регулярных выражений.
Знаки ^ и $ помечают начало и конец строки соответственно:
"^Genesis" - найти все строки, начинающиеся словом Genesis;
"eschatus$" - найти все строки, кончающиеся словом eschatus;
"^Out in cold$" - найти все строки, равные образцу.
Точка помечает любую букву:
"d..." - найти все слова из 4 букв, начинающиеся с d;
"d...$" - то же в конце строки;
"d..\ ." - найти все слова из 4 букв, начинающиеся с d и оканчивающиеся точкой
(знак \ - обратный слэш - отменяет специальное значение следующего символа).
Квадратные скобы задают возможные значения знака:
"^ [abcxyz]" - найти все строки, начинающиеся с букв a,b,c,x,y или z;
"[^Dd][a-z][a-z][a-z]" - найти все слова из 4 букв, не начинающиеся с D или d, в которых последние три буквы - малые (от a до z).
Фигурные скобки задают количество повторений (замыкание) предыдущего знака:
"[^Dd][a-z]{3}" - то же самое, что и предыдущий пример;
"[a-z]{3,5}" - найти все слова, содержащие от 3 до 5 малых букв.
Частные случаи замыкания обозначаются специальным образом:
* для {0} - ноль и более раз;
+ для {1} - один и более раз;
? для {0,1} - ноль или один раз.
Например:
$ grep ".*" people - просто напечатает все строки файла.
Примеры использования регулярных выражений:
уничтожить все пустые строки в файле:
$ grep -v "^ $" file > newfile;
уничтожить все строки, состоящие только из пробелов:
$ grep -v "^ *$" file > newfile.
Пользователи и группы
Имеется два файла с именами passwd и group в каталоге /etc, которые содержат информацию о пользователях и группах пользователей соответственно.
Одна запись в файле passwd соответствует одному пользователю и имеет следующие текстовые поля, разделенные символом двоеточия:
имя пользователя; пароль пользователя (в закодированном виде); целочисленный идентификатор пользователя; целочисленный идентификатор группы; комментарий, который содержит сведения о месте работы пользователя и может использоваться командой finger и учетными программами; каталог пользователя; интерпретатор команд пользователя.
Пример записи файла passwd (с пустым комментарием):
mary:KmHu1hE:201:10::/users/mary:/bin/csh
При наличии комментария его синтаксис определяется учетными программами.
Для некоторых системых программ требуется, чтобы идентификатор суперпользователя был равен нулю, а имя - root.
Одна запись в файле group соответствует одной группе и представляет собой строку текста со следующими полями, разделенными двоеточиями:
имя группы; пароль группы (в закодированном виде); целочисленный идентификатор группы; список имен пользователей группы, разделенных запятыми.
Пример записи файла group (для группы без пароля):
sect2115::10:mary,sas,temp,ges
Добавление нового пользователя в системе требует выполнения следующих трех действий, которые обычно реализуются командным файлом с именем newuser или adduser:
добавить запись в файл passwd с информацией о пользователе; создать каталог пользователя, причем пользователь должен быть владельцем этого каталога; добавить или скорректировать запись в файле group в соответствии с членством пользователя в некоторой группе.
Добавление и коррекция записей в файлах passwd и group может выполняться текстовым редактором (если нет командного файла newuser).
Каталог пользователя создается суперпользователем (возможно, посредством скрипта newuser) и вначале принадлежит ему. Чтобы изменить пользовательскую и групповую принадлежность каталога (и любого файла), используются команды chown (change own) и chgrp (change group) соответственно. Их может выполнить только суперпользователь.
Часто новый пользователь забывает свой пароль. Суперпользователь может в этом случае изменить пароль пользователя командой passwd, затерев забытый и сообщив пользователю новый:
# passwd mary New passwd : mmm Retype new passwd : mmm #
Вводимый пароль (здесь mmm) не виден.
Посылка сообщений командой write
Команда write посылает сообщение указанному пользователю в момент исполнения этой команды. Это означает, что адресат должен работать в системе в этот момент. Не многим нравится, когда сообщение приходит, как в данном случае, в случайный момент, в особенности во время набора собственного текста. Поэтому вы должны быть уверены в необходимости такого немедленного взаимодействия.
Типичный пример:
$ write boris Спасайся, красные окружили Белый Дом!!! ^D $
Сообщение заканчивается вводом знака конца файла Ctrl-D.
Адресат увидит у себя на экране:
Message from george tty 00 ... Спасайся, красные окружили Белый Дом!!! EOF
Если вы намерены ждать ответа и вести диалог, можно не вводить знак конца файла до конца диалога.
Пример:
$ write mary Поужинаем сегодня вечером? Извини, сегодня я иду громить памятники. (ответ)
Тогда завтра? И завтра не могу. Давай на следующей неделе? (ответ)
Ну, хорошо. EOF (ответ)
^D $
Получаемые от абонента тексты помечены словом (ответ).
На стороне абонента на экране будет:
$ Mesage from peter tty 03 ... Поужинаем сегодня вечером? Извини, сегодня я иду громить памятники. Тогда завтра? И завтра не могу. Давай на следующей неделе? (ответ)
Ну, хорошо. ^D $
Чтобы узнать, работает ли абонент в системе в данный момент, введите команду who.
Пример:
$ who george tty 00 08:30 peter tty 03 08:31 boris tty 07 04:12 mary tty 08 09:01
Текст сообщения можно взять из файла, перенаправляя стандартный ввод для write из этого файла.
Пример (сообщение из файла message):
write peter < message
Текст сообщения можно формировать, выполняя команды внутри текста. В этом случае команде предшествует восклицательный знак, например:
$ write peter Нужные тебе файлы в каталоге: !pwd /users/mary/docs/specs ! /users/mary/docs/specs ^D $
Ответ команды завершается тоже восклицательным знаком. Ни команда, ни ответ в текст сообщения не попадают.
Если вы не уверены, что полученные сообщения не нарушат вашу работу (например, ввод текстового файла), вы можете закрыться от посылаемых вам сообщений командой mesg:
$ mesg n $
где n - от no (нет).
Когда вы решите, что уже способны получать сообщения, подайте:
$ mesg y
где y - от yes (да).
Эта же команда без параметров подскажет вам, в каком состоянии по приему сообщений вы находились (no или yes), например:
$ mesg is y
т.е. прием разрешен. При входе в систему устанавливается состояние y.
Повторное исполнение предыдущих команд
Исполнение предыдущих команд, сохраненных в буфере истории, без повторного их набора можно осуществить различными способами.
Первый способ: напечатать восклицательный знак и имя команды. Исполняется самая последняя команда из буфера истории с этим именем. Например:
% !cd cd /users/peter/shells.
Необязательно печатать полное имя. Достаточно минимального количества символов начала имени, необходимого для однозначного его опознания в буфере истории, например:
% !c cd /users/peter/shells.
Второй способ: напечатать и номер команды в буфере истории без пробела между ними. Например:
% !1 ls -l <вывод команды ls -l> %
Наконец, имеется возможность использования последнего слова непосредственно предыдущей команды вводом двух знаков !$, например:
% mv /users/wowa/spasewar.c space.c % pr !$ | lpr pr space.c | lpr %
Позиционирование курсора
клавиши <стрелка влево>, <стрелка вправо>, <стрелка вверх>, <стрелка вниз>; H - home, M - middle, L - last: начало, середина, конец экрана; w - вперед на начало следующего слова; e - на конец текущего слова; b - назад на начало слова.
Практические советы
Прочитав эту главу, Вы можете попробовать стать администратором системы UNIX. Основные необходимые средства для поддержания целостности системы Вам теперь известны. Не забывайте регулярно делать копии системы и чистить лишние файлы. Основной проблемой будут Ваши взаимоотношения с другими пользователями. Опытный администратор в максимальной степени уступает требованиям других пользователей, чтобы пользователи не могли выйти за пределы отведенных им ресурсов. Дополнительные сведения Вы можете найти в книге [12].
Предопределенные переменные Shell
Некоторые из них можно только читать. Наиболее употребительные:
HOME - "домашний" каталог пользователя; служит аргументом по умолчанию для cd; PATH - множество каталогов, в которых UNIX ищет команды; PS1 - первичная подсказка (строка) системы (для v.7 - $).
Изменение PS1 (подсказки) обычно делается в login - файле, например:
PS1 = ? или
PS1 = "? " (с пробелом, что удобнее).
Изменение PATH:
$ echo $PATH - посмотреть;
:/bin:/usr/bin - значение PATH;
$ cd - "домой";
$ mkdir bin - новый каталог;
$ echo $HOME - посмотреть;
/users/maryann - текущий каталог;
$ PATH = :$HOME/bin:$PATH - изменение PATH;
$ echo $PATH - посмотреть;
:/users/maryann/bin:/bin:/usr/bin - новое значение PATH.
Реализации системы UNIX.
Наиболее распространенные реализации системы UNIX на персональных ЭВМ и рабочих станциях представлены в таблице [13].
Название/тип ПЭВМ | Микропроцессор | Производительность (MIPS) | Реализация UNIX |
PC AT-386/486 | i80386/486 | 16 | SCO UNIX |
PC AT-386/486 | i80386/486 | 16 | ISC UNIX |
PC AT-386/486 | i80386/486 | 16 | AT&T UNIX |
Apple Macintosh | m68030/040 | 12 | A/UX |
Sun SparcStation | Sparc | 18 | SunOS |
IBM PowerStation | RS6000 | 24 | AIX |
DEC DECStation | R3000 | 25 | Ultrics |
HP 9000 | HP800 | 10 | HP-UX |
Состав системы ISC UNIX System V.
Основные компоненты системы ISC UNIX System V Rel.3.2 [14].
core - ядро системы kernel - оболочка ядра системы development system - средства разработки программ manuals - экранные руководства пользователя и программиста VP/ix - эмулятор MS DOS UUCP - средства передачи данных по каналам связи STREAMs - механизм сетевых протоколов TCP/IP - сетевой протокол NFS - сетевая файловая система X-Windows - средства сетевых графических интерфейсов пользователя (GUI) Looking Glass - командная оболочка на базе GUI
Пример процедуры
:'Эта процедура работает с файлами, содержащими имена' : 'и номера телефонов,' :'сортирует их вместе или порознь и печатает результат на' :'экране или на принтере' :'Ключи процедуры:' :'-t (together) - слить и сортировать все файлы вместе' :'-p (printer) - печатать файлы на принтере' if test $# - eq 0 then echo "Usage: $ 0 file ... " > & 2 exit fi together = no print = no while test $# -gt 0 do case $1 in -t) together = yes shift ;; -p) print = yes shift ;; -?) echo "$0: no option $1" exit ;; *) if test $together = yes then sort -u +1 -2 $1 | tr ... > /tmp/$0$$ if $print = no then cat /tmp/$0$$ else lpr -c /tmp/$0$$ fi rm /tmp/$0$$ exit else if test -s $1 then echo "no file $1" > &2 else sort +1 -2 $1 | tr...> /tmp/$0$$ if $print = no then cat /tmp/$0$$ else lpr -c /tmp/$0$$ fi rm /tmp/$0$$ fi shift fi;; esac done.
Процедура проверяет число параметров $#, и если оно равно нулю, завершается. В противном случае она обрабатывает параметры (оператор case). В качестве параметра может выступать либо ключ (символ, предваряемый минусом), либо имя файла (строка, представленная метасимволом *). Если ключ отличен от допустимого (метасимвол ? отличен от t и p), процедура завершается. Иначе в зависимости от наличия ключей t и p выполняются действия, заявленные в комментарии в начале процедуры.
Пример скрипта
Данный скрипт выполняет сохранение файлов C-программ, которые уже сохранялись ранее. Файлы сохраняются в подкаталоге backup вашего рабочего каталога.
# foreach i ($argv) if ($i \ !~ ~/*.c) then # является ли файл $i файлом С-программы ? echo файл $i не является файлом С-программы continue else echo файл $i является файлом С-программы endif echo check file ~/backup/$i if (-e ~/backup/$i) then # находится ли файл $i в подкаталоге backup? echo файл $i не находится в подкаталоге backup continue endif echo compare two files $i and ~/backup/$i cmp -s $i ~/backup/$i if ($status != 0) then echo новая копия файла $i cp $i ~/backup/$i endif end.
Собственно копирование делается командой cp, а все остальные строчки скрипта организуют цикл и осуществляют проверки.
Процедура языка Shell
Это командный файл. Два способа его вызова на выполнение:
$ sh dothat (где dothat - некоторый командный файл);
$ chmod 755 dothat (сделать его выполнимым, т.е. -rwxr-xr-x)
$ dothat.
Следует знать порядок поиска каталогов команд (по умолчанию):
текущий; системный /bin; системный /usr/bin.
Следовательно, если имя вашего командного файла дублирует имя команды в системных каталогах, последняя станет недоступной (если только не набирать ее полного имени).
Просмотр конца файла
Команда tail печатает конец файла. По умолчанию - 10 последних строк:
$ tail /usr/pub/greek . . . .
Явно можно задать количество (со знаком -) или номер строки, от которой печатать до конца (со знаком +):
$ tail -3 /usr/greek - три последние строки;
$ tail +6 /usr/greek - последние строки, начиная с 6-й.
Просмотр строк текста
Поскольку ex - строчный редактор, вводится понятие номера строки и понятие текущей строки. Все строки текста занумерованы натуральными числами, начиная с единицы. Знак $ (доллар) означает номер последней строки текста.
Просмотр части текста на экране выполняется командой, состоящей из одного (для просмотра одной строки) или пары номеров - номера первой и номера последней строки части текста и символа P (print), который по умолчанию может быть опущен. Например:
: 1,5p program (input, output) ...... ...... : или просто
:1,5
Для просмотра всего текста надо ввести:
: 1, $
Чтобы напечатать строки вместе с их номерами, надо в конце команды просмотра поставить знак # (диез), например:
: 6, $# 6 include <stdio.h> 7 ....... 8 ....... .........
Следует помнить, что нумерация строк относительна. При удалении одной строки все строки перенумеруются. После выполнения команды просмотра текущей строкой становится последняя просмотренная строка.
Проверка и восстановление стуктуры файловой системы
Структура файловой системы, описанная выше в терминах i-узлов, блоков, косвенных блоков и суперблока, может быть нарушена и требовать восстановления. Например, при разрушении информации в трижды косвенном блоке могут появиться следующие проблемы:
некоторый блок может быть вне системы, т.е. не являться частью файла и не быть в списке свободных блоков; могут появиться дубли i-узлов, т.е. описывать один и тот же файл дважды; некоторый блок может одновременно быть частью файла и быть в списке свободных блоков; некоторый файл может существовать, не будучи включенным ни в один каталог.
К счастью, структура файловой системы обладает некоторой избыточностью, позволяющей восстанавливать отдельные поломки. Вот некоторые виды избыточности:
блок данных, являющийся каталогом, содержит имена файлов и номера i-узлов; где-то есть i-узел, соответствующий этому каталогу, и этот i-узел должен быть каталогом, а не обычным файлом; блок, включенный в список свободных блоков, теоретически не может быть частью какого-либо файла; для проверки этого достаточно сканировать все i-узлы для просмотра всех блоков, занятых файлами, и сканировать список свободных блоков; аналогично, блок, принадлежащий файлу, должен принадлежать только одному файлу; это легко проверить.
Эти и другие виды избыточности использует программа проверки файловой системы, запускаемая командой fsck (file system check). В различных реализациях существуют разные команды проверки целостности файловой системы: icheck, dcheck, ncheck. Однако все они в большей или меньшей степени перекрываются командой fsck. Типичное выполнение команды fsck выглядит следующим образом:
/etc/fsck ** Phase 1 - Check Blocks and Sizes ** Phase 2 - Check Pathnames ** Phase 3 - Check Connectivity ** Phase 4 - Check Reference Counts ** Phase 5 - Check Free List
Из примера видно, что fsck выполняется в несколько фаз.
На этих фазах производится следующая работа:
проверка целостности i-узлов (счетчик связи, тип и формат i-узла); проверка каталогов, указывающих на i-узлы, содержащие ошибки; проверка каталогов, на которые нет ссылок; проверка счетчиков связей в каталога и файлах; проверка неверных блоков и дублированных блоков в списке свободных блоков, неиспользуемых блоков, которые должны быть включены, но не включены в список свободных блоков, и счетчика общего числа свободных блоков.
Команда по умолчанию всегда проверяет корневую файловую систему: все другие файловые системы проверяются, если их имена занесены в файл /etc/checklist.
Следующий пример показывает действия команды fsck и администратора в случае обнаружения дубля i-узла для файла /user/src/sys/ux; администратор принимает решение удалить этот плохой файл, отвечая в диалоге согласием y (yes) на вопросы команды.
/etc/fsck ** Phase 1 - Check blocks and sizes 528627 BAD I = 66 ** Phase 2 - Check pathnames DUP/BAD I = 66 OWNER = root MODE = 100755 SIZE = 78409 MTIME = Jul 16 18:45 1987 FILE = /usr/src/sys/ux REMOVE ? y ** Phase 3 - Check connectivity ** Phase 4 - Check Reference Count BAD/DUP I = 66 OWNER = root MODE = 100755 SIZE = 78409 MTIME = Jul 16 18:45 1987 FILE = /usr/src/sys/ux CLEAR ? y UNREF FILE I = 36 OWNER = root MODE = 100600 SIZE = 0 MTIME = Jul 17 09:40 1987 RECONNECT ? y ** Phase 5 - Check Frec List 157 BLK(S) MISSING BAD FREE LIST SALVAGE ? y ** Phase 6 - Salvage Free List 302 files 5833 blocks 371 free
Обратите внимание на появление шестой фазы, которой не было при нормальном выполнении команды. На этой фазе уточняется и восстанавливается список свободных блоков.
После выполнения fsck, связанного с "починкой" файловой системы, может появиться сообщение:
***** BOOT UNIX (NO SYNC!) *****,
требующее перезагрузки системы без выполнения команды sync. Если этого не сделать, работа по восстановлению списка свободных блоков будет утрачена, так как копии управляющих таблиц и буфера в оперативной памяти остались старыми. Для их обновления требуется перезагрузка без выгрузки буферов на диск командой sync.
Необходимым условием правильной работы fsck является также наличие пустого каталога /lost+found в корневом каталоге. Если при выполнении fsck будут найдены каталоги, на которые никто не ссылается в проверяемой файловой системе, они будут подключены в каталог /lost+found для дальнейшего изучения их принадлежности.
Работа с руководствами для пользователя
Тексты руководств для пользователей находятся в различных подкаталогах man? каталога /usr/man, где вопросительный знак - метасимвол, принимающий значения от 1 до 8 в соответствии с нумерацией руководств по системе. Отдельные файлы этих подкаталогов содержат исходные тексты отдельных руководств. Например, подкаталог man1, содержащий файлы текстов команд, может иметь следующий вид (фрагмент):
$ ls /usr/man/man1 _ _ _ _ _ _ _ _ _ cpio.1 grep.1 mknod.1 ren.1 test.1 _ _ _ _ _ _ _ _ _
Исходные тексты руководств хранятся в этих файлах в подготовленном виде для команды форматирования - nroff (newrunoff). На выходе команды форматирования появится текст в формате, пригодном для выдачи на печать или терминал. Во многих системах текст руководства в выходном формате создается и запоминается в файлах каталога /usr/man/cat?/*, где ? и * - метасимволы в обычном смысле, выполнением команды catman.
Выдача руководства на терминал или печать выполняется командой man, которая в соответствии с указанным аргументом ищет сперва текст руководства в выходном формате и выдает его на стандартный вывод; в противном случае, она ищет исходный текст и вызывает команду nroff, результат работы которой выдается на стандартный вывод.
Добавление новых руководств требует знания форматов для команды nroff, работающей с пакетом man макроопределений.
РАБОТА С ТЕКСТОВЫМИ ФАЙЛАМИ
При разработке и документировании программного обеспечения неожиданно большое время занимает работа по созданию, анализу, проверке и исправлению текстовых файлов. Она выполняется достаточно простыми средствами печати файлов, поиска строк, замены букв и строк, сравнения файлов и тому подобное. Соответствующие утилиты весьма эффективны для выполнения таких работ по сравнению с обычным текстовым редактором.
Работы
Любая последовательность команд, разделенных метасимволами ; или -, а также отдельная команда является работой. Каждая работа выполняется отдельным процессом.
Заканчивая такую последовательность команд или отдельную команду знаком &, можно задать выполнение работы на заднем плане, то есть параллельно с будущими работами. В этом случае система сообщает вам номер работы в скобках и номер процесса, например:
% du > usage & [1] 503 % ls -al <Содержание текущего каталога> %.
По окончании работы система сообщает о завершении (нормальном или аварийном), указывая номер работы и процесса, например:
..... [1] 503 - Done du > usage %.
Чтобы посмотреть, какие работы активны в данный момент, используйте команду jobs -l.
Эта команда распечатает список работ с указанием их состояния:
Running (выполняется) или Stopped (остановлена).
Разборка и сборка файла
Многие команды ограничивают размеры файла, который они могут обработать. Если ваш файл слишком велик, вы можете разбить его на части командой split, а впоследствии после обработки собрать из этих частей командой cat. Каждая часть становится независимым файлом с именами по умолчанию xaa, xab, xac, ..., xzz. Размер части по умолчанию - 1000 строк.
Пример:
$ split bigfile.
Можно изменить размер по умолчанию, задавая его явно, например, 500 строк:
$ split -500 bigfile.
Можно задавать имена частей, например:
$ split bigfile ribs.
В этом случае имена будут ribsaa, ribsab, ..., ribszz.
После необходимой обработки всех или некоторых частей сборка файла из частей выполняется, например, следующим образом:
$ cat ribs?? > bigfile.new,
где знаки вопроса - метасимволы, обозначающие любой символ.
Типичным примером применения технологии разборки - сборки является печать отдельных избранных страниц файла.
Пример:
$ pr bigfile > bigpr $ split -66 bigpr $ lpr xaf xaj
Здесь будут напечатаны 6-я и 10-я страницы размером 66 строк исходного файла.
РЕДАКТОРЫ EX И VI
Это комбинация двух непересекающихся возможностей: ex - строчный редактор (расширение базового редактора ed); vi - экранный редактор (может выполнять также все команды редактора ex).
Реконфигурация операционной системы
Параметрируемость операционной системы позволяет оптимальным образом настроить ее для работы на заданных аппаратных средствах и с учетом особенностей использования системы ля заданного класса задач.
Совокупность значений технических параметров ОС в загрузочной области называют конфигурацией ОС. Для управления конфигурацией имеется команда: /lbin/uconfig (System III).
Ее необязательный параметр указывает спецфайл устройства, на котором находится загрузочная область (по умолчанию /dev/rhd).
Будучи поданной без опций, команда uconfig показывает текущее значение параметров. Опция -f <имя файла> позволяет установить новые значения нескольких или всех параметров из указанного файла, а опция -d (default) устанавливает всем параметрам значения по умолчанию, используя файл /etc/uconfigtab.
Системными параметрами являются (в скобках - значения по умолчанию):
устройство виртуальной памяти (системный диск); размер буфера КЭШ-памяти (1024 байта); число буферов КЭШ-памяти (0; вычисляется динамически); длина цепочки буферов чтения (0; вычисляется динамически); время активности процесса после интерактивного чтения; время резидентности сегмента в памяти перед свопингом на диск (0; вычисляется динамически); размер страницы (1024 байта); время резидентности страницы в памяти перед свопингом на диск; максимальный размер страничного пула виртуальной памяти (0; вычисляется динамически); число страниц буфера дисплея, где страница равна 24 строкам дисплея; максимальный размер стэковой памяти (0; вычисляется динамически); минимальная доля страниц в рабочем множестве страниц; максимальное число процессов одного пользователя (500).
При выполнении команды uconfig для изменения системных параметров надо быть уверенным, что ОС в загрузочной области совпадает с текущей ОС. В противном случае, результаты выполнения команды будут непредсказуемы.
РУКОВОДСТВО СИСТЕМНОГО АДМИНИСТРАТОРА
В функции системного администратора системы UNIX входит повседневное управление системой во всех аспектах ее существования, таких как подключение новых пользователей, управление файловой системой, изменение конфигурации и других. Следует заметить, что на персональных ЭВМ эти функции могут исполняться прикладным программистом.
Имеется ряд команд, расположенных обычно в каталоге /etc, рассчитанных на управление системой, таких как fsck, mount, chown и так далее. Как правило, каталог /etc доступен только суперпользователю, так что системный администратор должен обладать правами суперпользователя.
Символьный отладчик
Как правило, имеется единый символьный отладчик для программ на нескольких языках программирования, компиляторы которых вырабатывают объектный код и таблицы символов в единеом формате. Символьный отладчик обычно имеет альтернативные имена для разных языков, например, cdb, fdb и pdb для языков C, ФОРТРАН-77 и PASCAL соответственно. Вызов отладчика производится одноименной командой, в которой указывается файл кода отлаживаемой программы, по умолчанию a.out. Для генерации и сохранения отладочной информации (таблиц символов и т.п.) компиляция программы должна производиться с ключом -g.
Пример:
$ fc -g test.f check.f prove.f $ fdb >
Знак > - подсказка отладчика, приглашающая вводить команды отладчика. Команды отладчика позволяют:
посмотреть текущие значения переменных выполняемого оператора, строки исходного текста, процедуры, файла в указанном формате; устанавливать и сбрасывать точки прерывания для пошагового выполнения отлаживаемой программы между точками прерывания и/или с постоянным шагом; задавать утверждения, проверяемые перед выполнением каждого оператора для останова перед теми операторами, для которых утверждение истинно; копировать все сигналы, связанные с отлаживаемой программой; записывать и повторно использовать команды сеанса отладки (командный файл на входе отладчика).
Более подробную информацию о символьном отладчике можно найти в руководстве по команде cdb.
Синхронизация файловых систем
При обменах с файлами система поддерживает в оперативной памяти множество буферов, свободных блоков, i-узлов, а также супер-блок. Для корректного завершения операций с системой необходимо перед ее выключением переписать все данные из этих буферов и блоков в дисковую память. Выполнение этих действий называется синхронизацией файловой системы и реализуется командой sync:
/etc/sync
Команда не выдает никаких сообщений, а подсказка системы говорит лишь о запуске синхронизации. Поэтому обычно команду выполняют повторно после некоторого ожидания.