Text
                    B.  H.  ОРЛОВ
В.  Ю.  БЛАЖНОВ
 О. 	А.  БАРВИН
 МОБИЛЬНАЯ
ОПЕРАЦИОННАЯ
СИСТЕМА
MOC  ЕС
 МОСКВА
 ФИНАНСЫ  И  СТАТИСТИКА


ББК 32.973 0-66 УЖ 681.142 P e ц e н з e н т ы: канд. тех, наук В. Я. Тимонин и канд. техн. наукВ.В.Митрофанов Орлов B.H. и др. 0-66 Мобильная операционная система МОСЕС/В.Н.Орлов, В.Ю.Блажнов, О.А.Барвин. - M.: Финансы и статистика, 1990. - 208 с; ил. ISBN 5-279-00356-5. Книга содержит описание основных и дополнительных возможностей мобильной операционной системы MOC ЕС, которая приобретает все большую популярность среди пользователей ЕС ЭВМ, а также приемов программирования на языке shell. Для студентов и программистов разной квалификации. ББК32.973 ISBN 5-279-00356-5 Издательство **Финансы и статистика**, 1990
Посвящается памяти учителя В.Н.Лебедева ВВЕДЕНИЕ У читателя, впервые открывшего эту книгу, может возникнуть вопрос: почему рассматривается именно мобиль¬ ная операционная система, а не любая другая, например РАФОС? Попытаемся ответить на этот вопрос. С 1949 r., когда заработала первая электронная вы¬ числительная машина с запоминаемой программой, и до наших дней развитие ЭВМ сделало поистине грандиозный скачок. На первые ЭВМ, как и на первый самолет братьев Райт, люди смотрели, как на чудо. А сегодня говорят о наступ¬ лении "компьютерной эры”, звучат серьезные предупрежде¬ ния о том, что если специалист не будет обучаться компь¬ ютерной грамотности, то он отстанет от жизни, не получит продвижения по службе. Сегодня становится привычным, что на рабочем столе студента, инженера, научного сотрудника мы видим либо терминал, подключенный к большой ЭВМ, либо персональную ЭВМ (ПЭВМ), которые служат то пишущей машинкой, то суперкалькулятором, то информационно-спра¬ вочной системой, то кульманом, то средством управления экспериментальной установкой. В США, например, один тер¬ минал сегодня приходится на 10 работающих, для поль¬ зователей ЭВМ фирмы ИБМ - 1 терминал на 6 пользователей, а в самой фирме ИБМ один терминал имеют в среднем два сотрудника. С появлением на рынке ПЭВМ насыщенность ЭВМ становится еще более высокой. В ведущих фирмах США на одного научно-технического сотрудника приходится уже 1,5 терминала или ПЭВМ. Руководители фирм считают дисп¬ лей на столе инженера необходимым предметом оргтехники, как и телефон. В нашей стране эти цифры пока не столь впечатляющи, однако подготовка к этапу широкомасштабного внедрения ЭВМ во все сферы жизни сегодня ведется повсеместно: в школах, высших и средних специальных учебных заведениях, на производстве, на курсах повышения квалификации. За
годы двенадцатой пятилетки выпуск средств вычислительной техники в нашей стране увеличится в 2,3 раза, только в вузах будет создано около 130 тыс.рабочих мест, обору¬ дованных ПЭВМ и терминалами. Какими же знаниями о вы¬ числительной технике должен обладать современный инже¬ нер? Здесь уместно сравнение ЭВМ с автомобилем. Легковые автомобили покупают миллионы людей, большинство из них порой имеют самые общие сведения о машине, только те, которые нужны при покупке: максимальная скорость, мощ¬ ность двигателя, вместимость салона, расход горючего и т.п. Так же обстоит дело и с ЭВМ. Организация, приобре¬ тающая ЭВМ, или человек, приобретающий персональный компьютер, прежде всего интересуются быстродействием центрального . процессора, объемом оперативной и внешней памяти, количеством подключаемых терминалов и т.п. Инже¬ нера, работающего в конструкторском бюро или на произ¬ водстве, мало заботит, как устроена ЭВМ, какие микросхе¬ мы входят в ее состав, как работают центральный процессор и каналы ввода-вывода. Для него главное, чтобы он на ней смог решить свои задачи. Продолжим аналогию между автомобилем и ЭВМ. Для того чтобы человек смог ездить на автомобиле, он должен изучить правила вождения и правила дорожного движения. Не зная правил вождения, он не тронется с места, а езда без знания и соблюдения правил дорожного движения может привести к аварии. Аналогичные правила должен знать и любой человек, начинающий работу с ЭВМ. Вычислительным машинам, так же как и автомобилю, кроме "мотора” (центрального про¬ цессора), требуется "рулевое управление", которое обес¬ печило бы согласованное функционирование их узлов и дало возможность использовать их человеку. Такое "рулевое управление " для ЭВМ - операционные системы (ОС) - одно из самых выдающихся достижений в области вычислительной техники, которое позволило по-но- вому взглянуть на возможности и сферу применения вы¬ числительных машин. Операционные системы сегодня неотде¬ лимы от ЭВМ, они являются ее естественным продолжением, и порой бывает трудно определить, где кончается машина и где начинается операционная система. Для работы с ЭВМ достаточно знать возможности ОС, предоставляемые пользователю в виде некоторого языка взаимодействия с ней. Сразу оговоримся, что языки взаи¬ модействия с ОС и языки программирования не имеют между собой ничего общего. Язык взаимодействия с операционной системой - это просто набор команд. 4
Пользователь, набирая их на клавиатуре терминала, может заставить машину делать то, что ему необходимо: выполнить некоторую программу, подготовить и распечатать документ, обменяться корреспонденцией с другими пользо¬ вателями, просмотреть информацию в банке данных, провес¬ ти арифметические расчеты и, наконец, ввести, оттрансли¬ ровать и отладить программу, написанную на одном из языков программирования высокого уровня, включенных в состав ОС. Перечень этих команд операционной системы и составляет "правила вождения" вычислительной машины, а правила и особенности их применения - "правила дорожного движения" в системе. Без знаний первых пользователь не сможет работать с ЭВМ, а несоблюдение вторых может при¬ вести к "аварии", например уничтожению очень нужной программы. Сразу оговоримся, что целью книги не является описание того, как устроена система MOC ЕС. В книге в первую очередь будет идти речь о том, какие возможности предоставляет мобильная операционная система пользовате¬ лю и как их применять на практике. Современные операционные системы резко отличаются от систем, ориентированных на перфокарты, которые работали на ЭВМ 15, 10 и даже 5 лет тому назад. Современные ОС - это прежде всего интерактивные системы, рассчитанные на взаимодействие пользователя с машиной посредством дисп¬ лея. В современные системы включены различные програм¬ мные средства общего назначения (так называемые утили¬ ты), которыми можно пользоваться вообще без программи¬ рования. Освоив их и осознав все преимущества применения ЭВМ, человек гораздо легче переходит к программированию. К таким средствам ОС можно отнести редакторы текстов, с помощью которых легко и просто готовить, корректировать и размножать различные документы; электронную почту, посредством которой пользователи могут обмениваться информацией между собой; так называемые файловые системы и системы управления базами данных, на основе которых можно строить информационно-поисковые системы, и ряд других. Даже не умея программировать, пользователь может использовать в своей работе готовые программы. Но и здесь не обойтись без знания ОС: как ввести программу в память машины, как ее выполнить, где и как подготовить для нее исходные данные, где и как сохранить результаты счета, - все это "рычаги управления" современной вы¬ числительной машины. До последнего времени для каждосо типа ЭВМ разрабаты¬ вались собственные операционные системы: ОС PB для СМ ЭВМ, ДОС ЕС и ОС ЕС для ЕС ЭВМ, MS-DOS и CP/M для 5
ПЭВМ, имеющие различные языки взаимодействия, запросы на выполнение системных функций, директивы ввода -вывода, т.е. у разных вычислительных машин были свои "рычаги управления". Если учесть, что смена поколений ЭВМ происходит каждые 5 - 7 лет, что инженеру приходится обращаться за помощью как к большой, так и к персональ¬ ной ЭВМ, что у инженера может быть накоплена большая библиотека программ (например, имитационного моделирова¬ ния), которую он хотел бы использовать на любой ЭВМ и сохранять при переходе на новую машину, то понятно, какой ужас его охватывает при виде такого многообразия машин, и самое главное - операционных систем. Часто даже в том случае, когда несколько ОС предназначены для машин одного и того же типа, они имеют существенные различия в языке взаимодействия пользователя с системой. Все это приводило (да и сейчас часто приводит к тому, что даже профессиональному программисту при переходе с одной системы на другую требуется серьезная переподго¬ товка). Еще большие накладные расходы связаны с переносом пользовательских программ, без которых уже невозможна нормальная работа инженера, в новую ОС. Рано или поздно стандартизация должна была коснуться и операционных систем (как это уже было с языками программирования и вычислительными сетями), и в первую очередь языка взаимодействия с системой. Должна была появиться мобильная опер*ционная система, функциони¬ рующая на всех типах и классах ЭВМ и имеющая унифи¬ цированный язык взаимодействия. Такой ОС стала в насто¬ ящее время система ЮНИКС, которая с начала 80-х годов уверенно выходит по числу приложений на уровень "стан¬ дарта - де - факто" мировой индустрйи ЭВМ в целом. В Японии, например, система ЮНИКС рассматривается как основной претендент в качестве стандартной операционной системы для ЭВМ пятого поколения. Появление и широкое распространение операционных сис¬ тем типа ЮНИКС на ЭВМ различных типов и классов создало объективные предпосылки для того, чтобы пользователь, освоив унифицированное "рулевое управление", а точнее, язык взаимодействия с системой типа ЮНИКС, мог успешно работать на различных ЭВМ, безболезненно переходя от одной машины к другой. Однако объяснять феномен системы ЮНИКС только необхо¬ димостью стандартизации было бы не совсем верным. Как правило, операционные системы создаются большими коллек¬ тивами профессиональных программистов, которые далеки от проблем рядовых пользователей ЭВМ, поэтому их больше 6
заботит, как бы "выжать” максимум возможностей из ЭВМ, и в меньшей степени проблемы применения их пользователями. Удачным исключением из этого правила стала операцион¬ ная система ЮНИКС, которая с самого начала в отличие от других систем проектировалась с учетом потребностей рядового пользователя. Не последнюю роль в простоте и обозримости системы ЮНИКС сыграло то, что в ее разработ¬ ке участвовали два человека. Учет накопленного опыта, а также ряд новых и плодотворных идей позволили авторам создать принципиально новую ОС, которая в полной мере отвечает принципу "все гениальное просто". Она стала антиподом операционной системы OS/360, которая для многих системных программистов, не говоря уже о рядовых пользователях, осталась "вещью в себе" из-за эклектич¬ ности и громоздкости. Несмотря на то что ОС ЮНИКС, как и любая другая ОС, является сложной программной системой, ее часто называют "системой для домохозяек" - настолько прост язык взаимодействия с ней. Основной режим работы системы ЮНИКС - диалог. В отличие от традиционных сис¬ тем (типа ОС ЕС) в системе ЮНИКС пользователь не найдет языка управления заданиями, который создавал дополни¬ тельные трудности для инженера на его тернистом пути к освоению ЭВМ. Совместимые с системой ЮНИКС операционные системы созданы или создаются и в нашей стране. Это инструмен¬ тальная мобильная операционная система ИНМОС для СМ ЭВМ, диалоговая мобильная единая операционная система ДЕМОС для СМ ЭВМ и ЕС ЭВМ, мобильная операционная система MOC ЕС для ЕС ЭВМ. В настоящее время в НИЦ ЭВТ под руководством В.В.Митрофанова завершилась разра¬ ботка мобильной операционной системы MOC-M для ПП ЭВМ -ЕС, которая совместима с системой MOC ЕС. В двенадцатой пятилетке мобильные операционные системы типа ЮНИКС бу¬ дут реализованы для всех типов и классов отечественных ЭВМ. Для использования ОС ЮНИКС в повседневной работе не обязательно владеть каким-либо языком программирования, система располагает широким спектром программ общего назначения (утилитами), которые могут оказать поль¬ зователю существенную помощь. Освоив "рулевое управ- лецие" системы, пользователь получит хорошего помощника, который поможет в разработке, редактировании и размно¬ жении различных документов; станет его электронным секретарем, вовремя напоминающим о текущих делах; поможет в инженерных расчетах и создании банка данных. Имеющиеся средства ОС ЮНИКС позволят обмениваться 7
пользователям между собой корреспонденцией и проводить телеконференции. Для того чтобы начать работу с систе¬ мой, достаточно освоить 5 - 10 простых команд. Материал книги написан авторами на основе продрлжи- тельной практической работы в среде мобильной операцион¬ ной системы MOC ЕС. Авторы очень благодарны коллективу разработчиков, возглавляемому В.В.Митрофановым, за боль¬ шую практическую помощь, которую они получили от них. Авторы надеются, что данная книга окажется полезной как профессиональным программистам, которые смогут не только расширить свои знания о системах типа ЮНИКС, но и полу¬ чить новые сведения о возможностях MOC ЕС, а также тем, кто только начинает осваивать работу с ЭВМ. Книга состоит из трех разделов. В первом разделе, который адресован в первую очередь начинающим пользова¬ телям, дается описание основных возможностей системы MOC ЕС. Второй раздел посвящен программированию на языке shell и содержит большое количество полезных s/ie//-npor- рамм. Третий раздел посвящен дополнительным возможностям MOC ЕС. Введение, раздел 2, главы 2, 3, 5, 9, 11 и раздел на писаны В.Н.Орловым, главы 1, 4 подготовлены В.Ю.Блажно вым, глава 10 написана О.А.Барвиным. Общее редактирова¬ ние книги выполнил В.Н.Орлов.
Раздел 1 ОСНОВНЫЕ ВОЗМОЖНОСТИ MOC ЕС Глава 1. НАЧАЛО РАБОТЫ, ЭЛЕКТРОННАЯ ПОЧТА, ЭЛЕКТРОННЫЙ ТЕЛЕФОН Изучение новой операционной системы можно сравнить с путешествием по незнакомой стране, где поначалу все пугает. Однако только путешествуя по стране, знакомясь с людьми и жизнью страны, можно изучить, понять традиции народа, найти друзей. Лучший способ изучения "страны” под названием MOC ЕС - это "путешествие" по ней, т. e. непосредственная работа с системой. Работа с системой MOC ЕС начинается с входа в нее. Для того чтобы пользователь имел право входа в систему, ему необходимо получить визу, т.е. зарегистрироваться в качестве ее абонента. Для этого он должен обратиться к администратору системы и сообщить ему некоторые сведения о себе. Как правило, это фамилия, место работы, телефон и т.п. Администратор системы сообщает пользователю его регистрационный номер (например, b513), под которым он зарегистрирован в системе, и пароль. После того как пользователь зарегистирован в качестве абонента системы, он может начать работу с ней. Для этого необходимо включить терминал и нажать клавишу ВВОД. После нажатия клавиши ВВОД на экране терминала появится следующий текст: MOC ЕС 1.0 Namei Получив это сообщение, на клавиатуре терминала необ- 9
ходимо набрать регистрационный номер (в наших примерах b513) и нажать клавишу ВВОД. После короткой паузы систе¬ ма потребует ввода пароля: мос ЕС 1.0 Name: b513 PASSUORD: Пароль - это любая последовательность символов, кото¬ рая должна держаться в секрете, если пользователь не хочет, чтобы к его информации имели доступ посторонние люди, и которая вводится в систему в момент регистрации в ней пользователя и служит для подтверждения регистра¬ ционного номера пользователя. Любая набираемая на клавиатуре терминала информация отображается на экране. Исключение сделано только для пароля, вводимые символы которого не отображаются на экране терминала. Ввод пароля требует особого внимания, поскольку ошибка при вводе пароля приведет к необходи¬ мости повторения всей процедуры входа в систему. Если введенный пароль оказался правильным, то про¬ цедура входа на этом заканчивается, в противном случае система потребует ввести заново регистрационный номер и пароль. Процедура входа в систему заканчивается выводом на экран терминала приглашения на ввод команд. По умолчанию в качестве приглашения используется символ $. Однако, как это будет показано ниже, пользователь может легко изменить символику приглашения, напримрр, на следующий текст: "ВАША КОМАНДА ВЫПОЛНЕНА. ВВЕДИТЕ СЛЕДУЮЩУЮ" Приглашению к вводу команд может предшествовать текст "You have mail" ("Вы получили почту”), означающий, что для пользователя есть корреспонденция от других абонен¬ тов системы. Если пользователь работает первый раз с системой, то скорее всего это добрые пожелания со стороны администратора системы. Получив сообщение *You have mail", пользователь, естественно, хочет побыстрее посмотреть адресованную ему корреспонденцию. Однако прежде чем рассмотреть работу с электронной почтой, сделаем ряд коротких замечаний. Рядовой пользователь системы МОС ЕС в процессе рабо¬ ты большую часть времени имеет дело с двумя программами: монитором (программа shelt) и экранным редактором. 10
текстов (программа ned). Разумеется, чтобы свободно владеть системой MOC ЕС, необходимо знать и другие программы, но в основном используются именно эти две. Экранный редактор предназначен для создания и ре¬ дактирования текстовых файлов. Заметим, что файл предс¬ тавляет собой поименованную совокупность информации. В текстовом файле может храниться исходный текст програм¬ мы, документация, корреспонденция, которую , пользователь приготовил для отправки своим коллегам по "электронной почте", и т.п. Безусловно, важнейшей программой системы MOC ЕС явля¬ ется монитор shell, в функции которого входит выполнение вводимых пользователем команд. В связи с этим монитор shell часто называют интерпретатором команд. Итак, мы остановились на том, что для пользователя есть почта. Для ее просмотра необходимо ввести команду tnail: You have mail $ mai 1 Интерпретатор команд sheU, получив команду mail, выводит на экран терминала пользователя все полученные сообщения одно за другим. После каждого сообщения сис¬ тема выводит символ ?, которым "спрашивает" пользова¬ теля, что делать с выведенным сообщением. Для просмотра следующего сообщения достаточно нажать клавишу ВВОД. Предыдущее сообщение в этом случае сохранится в "почто¬ вом ящике" пользователя, и при следующем входе в систему пользователь вновь получит уведомление об имеющейся для него корреспонденции. Для уничтоженния сообщения доста¬ точно ввести после символа ? команду d, для сохранения поступившего сообщения в некотором файле необходимо ввести команду w uuiajpaiuta. Пример 1.1. You have mail $ mail В Бивлиотеку поступил журнал "Техника и наука" n7 за 1987 г. с ОБЗорной статьей по операционным системам p d 11
24.09.88 г. в 12 часов в МДНТП состоится лекция "Перспективы развития системы MOC ЕС" w lekcya $ В данном примере первое сообщение уничтожается (команда d), а второе сохраняется в файле с именем 1ексуа(командаи^еАгуа). После просмотра всех сообщений на экране терминала появляется приглашение к вводу очередной команды. За¬ метим, что команду mail для просмотра содержимого своего "почтового ящика" пользователь может вводить во время сеанса работщ с системой в любой момент времени. Пользователь системы MOC ЕС может не только получать почту, но и сам готовить письма и рассылать их своим корреспондентам. Предположим, что пользователь решил отправить письма товарищам Петрову и Сидорову. Прежде всего ему необходимо узнать регистрационные номера этих пользователей. В системе MOC ЕС регистрационные номера всех абонентов хранятся в файле с именем /etc/identity. Прочитать содержимое любого файла (в том числе и файла lekcya, в котором в предыдущем примере было сохранено сообщение, поступившее по электронной почте) можно командой cat UMajpaiuia, например: $ cat /etc/identity —польз.— —ФИО b512 b500 Молчанов B.A, Петров A.A. b502 b513 b521 Сидоров H.H. Сурнов С.И. Стерехова Л.Я. В случае, если размеры файла превышают размеры экрана терминала, файл выводится постранично. Выводимая на экран терминала страница, если она не является послед¬ ней, помечается в правом нижнем углу текстом "More ...". В этом случае для просмотра следующей страницы файла необходимо нажать клавишу CTPH ЭКР (СТиРаНие ЭКРана). Теперь, зная регистрационные номера Петрова (b500) и Сидорова (fr502), пользователь может отправить им свое 12
сообщение. Для этого ему достаточно ввести следующую команду: mail b500 b502 После ввода команды осуществляется ввод передаваемого сообщения путем набора его на клавиатуре терминала. Признаком конца набранного сообщения является ввод в отдельной строке символа. (точка). Пример 1.2. $ mail b500 b502 Приглашаю Вас на совещание по системе MOC ЕС 24.10.88 r. Боярский $ Вместо набора символа V можно нажать клавишу ПФЗ, что также будет свидетельствовать о конце набора сообще¬ ния. Текст отправляемого сообщения может быть предвари¬ тельно подготовлен в некотором файле (например, в файле с именем sbor). Тогда для отправки сообщения своим корреспондентам удобно воспользоваться командой mail следующеговида: mail номер__1 номер__2... номер__Ы<имя_файла где поле uoMepJ содержит регистрационный номер поль¬ зователя, которому адресуется сообщение, а поле имя_фай- яа - имя файла, в котором хранится отправляемое сообще¬ ние. Для нашего примера имеем: $ mail b500 b502<sbor $ Предварительную подготовку текста сообщения можно выполнить с помощью редактора текстов, которые рассмат¬ риваются в следующей главе, либо с помощью команды cat следующего вида: са±>имя__файла 13
После ввода данной команды пользователь с клавиатуры дисплея может вводить данные, которые будут заноситься в файл, имя которого указано в поле uMajpaiuta. Признаком окончания ввода данных в файл служит нажатие клавиши ВЫЗОВ ТЕСТА. Пример 1.3. $ cat>sbor Приглашаю Вас на совещание по системе MOC ЕС 24.10.88 r. Боярский [ВЫЗОВ ТЕСТА] $ В случае, если сообщение' является срочным или пользователю необходимо срочно решить какой-либо вопрос с одним из коллег, система MOC ЕС предоставляет в распоряжение пользователя "электронный телефон". Для установления связи посредством электронного телефона требуется знать не только регистрационный номер адреса¬ та, но и, кроме того, работает ли он в данный момент времени с системой. Регистрационный номер адресата можно узнать, выполнив команду вида cat /etc/identity Получить справку о пользователях, работающих в теку¬ щий момент с системой, пользователь может, выполнив команду who: $ who b512 tty3cl Маг- 12 09:47 b515 tty3c0 Маг 12 09:33 b513 ttyOcO Mar 12 08:52 ql01 ttyOcl Mar 12 09:43 r034 ttyOc2 Mar 12 09:10 $ Предположим, что пользователь, имеющий регистраци¬ онный номер b513, хочет обменяться мнением по интересу¬ ющей его проблеме с пользователем, зарегистрированным под номером ft515. Для этого необходимо ввести команду: write b515 14
После того как будет выполнена данная команда, на эк¬ ране терминала пользователя, имеющего регистрационный номер b515, появится сообщение "Message from b513 tiv3c0" ("Сообщение от b513 на терминале tty3c0"). Пользователь b515, получив это сообщение, должен приостановить свои действия и ввести команду write b513, те. "поднять” телефонную трубку. С этого момента поль¬ зователи могут обмениваться информацией, набирая ее на клавиатуре терминала и нажимая клавишу ВВОД. Для выхода ит режима электронного телефона достаточно нажать кла- вишуПД2. Если пользователь предпочитает, чтобы его работе не мешали "телефонные" звонки, он может отключить свой "телефон". Для этого ему достаточно ввести команду mesg n Снова включить телефон пользователь может, выполнив команду mesg у. Отличие электронной почты от электронного телефона состоит в следующем. При отправке корреспонденции по электронной почте не требуется, чтобы пользователь, которому адресована корреспонденция, работал в данный момент, главное, чтобы он был зарегистрирован в качестве абонента системы MOC ЕС. Отправленная корреспонденция будет сохранена в почтовом ящике пользователя, которому она адресована. При первом же входе в систему пользова¬ тель получит уведомление (’'You have mail") об имеющейся для него корреспонденции. Если же пользователь отправил сообщение другому поль¬ зователю, не убедившись, что он активен в настоящее время (команда who), по электронному телефону, то корреспонденция может быть утрачена, так как сообщения, пересылаемые по электронному телефону, не сохраняются в системе. Можно сформулировать общее правило: 1) необходимым и достаточным условием пересылки сообщения пользователю по электронной почте является факт его регистрации в качестве абонента системы MOC ЕС; 2) необходимым условием пересылки сообщения некото¬ рому пользователю по электронному телефону является факт его регистрации в качестве абонента системы, а доста¬ точным условием, во-первых, работа данного пользователя в данный момент времени и, во-вторых, чтобы его телефон нс был отключен. Отметим, что в системе MOC ЕС имеется развитая справочная служба, у которой можно получить консультации но любой из команд системы, в том числе и рассмотренных выше. Для получения консультации достаточно ввести команду вида 15
man имя_команды Например, выполнив команду man man, пользователь на экране терминала получит описание команды man, т.е. как работает справочная служба системы MOC ЕС. Для завершения сеанса работы с системой MOC ЕС достаточно ввести команду logoff. Однако, прежде чем выйти из системы, рекомендуется периодически менять пароль, чтобы свести к минимуму риск доступа к информации посторонних людей, которые могли узнать текущий пароль пользователя. Пользователь может изменить пароль в любое время, воспользовавшись командой passwd. Протокол работы этой команды предусматривает: а) ввод старого пароля; б) ввод нового пароля; в) если длина первого пароля меньше шести символов, то настоятельную просьбу сделать пароль более длинным; если пользователь не желает воспользоваться этим сове¬ том, то он должен продублировать ввод нового пароля; г) подтверждение нового пароля. Пример 1.4. $ passwd Changing rassword for b513 (Изменение пароля для b513) Old password: BHO New password: OBH Please use а longer password (Измените, пожалуйста, длину пароля) New password: OBH Please use а longer password New password: OBH Reture new password: OBH (Подтвердите новый пароль) $ Заметим, что, хотя в этом примере показаны старый (BHO) и новый (OBH) пароли, на самом деле они на экране терминала не появляются. Их вывод подавляется точно так же, как и при входе в систему. 16
Глава 2. ПОДГОТОВКА И РЕДАКТИРОВАНИЕ ТЕКСТОВЫХ ФАЙЛОВ Основной единицей манипулирования в системе MOC ЕС мнлиются файлы, которые могут содержать исходные тексты программ, объектные и загрузочные коды программ, доку¬ ментацию, справочную информацию и т.п. В связи с этим ношикает проблема создания, подготовки и редактирования файлов. В системе MOC ЕС имеется набор редакторов для них целей. В состав MOC ЕС, в частности, входят: строчный редактор текстов (ed); потоковый редактор текстов (sed); шестнадцатеричный редактор текстов (hed), позволяющий Срабатывать файлы, содержащие объектные и загрузочные коды программ; полиэкранный редактор текстов (red), позволяющий нссти одновременную обработку несколькихфайлов. Наиболее широкое применение получил экранный редактор текстов ned, позволяющий непосредственно с экрана тер- минала создавать и редактировать различные текстовые файлы. Запуск экранного редактора текста ned осуществляется командой вида ned имя^райла Имя редактируемого файла указывается в поле имя_фай- /w. Имя файла - это любая последовательность допустимых и системе MOC ЕС символов ( например, filel, 21, text, ra/.glav.5 и т.п.). Отметим одну особенность именования файлов, содер¬ жащих исходные тексты программ на языках Си, Фортран и Паскаль. Файлы, содержащие программы на на этих языках, должны оканчиваться соответственно на следующие после¬ довательности символов: .c , .f и .p . Так, файл с именем proc.p содержит программу на языке Паскаль, а файл с именем file.f - программу на языке Фортран. Мосле запуска редактора экран терминала пользователя будет разделен на три поля: поле служебной информации, иолс первичных команд редактора и информационное поле для набора текста. В поле служебной информации редактор 17
помещает справочную информацию, такую, как имя файла, с которым работает пользователь, количество строк в файле, количество внесенных за сеанс изменений в файл, а также информацию о неправильно введенных командах или преду¬ преждение о возможных последствиях выполняемых пользо¬ вателем команд. Информационное поле служит как для отображения храня¬ щейся в файле информации, так и для ее корректировки. Вся информация в файле хранится в виде последователь¬ ности строк длиной до 4096 символов. Все строки информа¬ ции, содержащиеся в файле и выводимые на экран, автоматически нумеруются от начала файла в правых четырех позициях информационного поля (поле нумерации). При работе с редактором различают первичные команды редактора, которые набираются в поле команд редактора, и строчные команды, которые набираются в поле нумерации. Предположим, что с помощью редактора ned пользователь решил подготовить статью в файле с именем statya. Для этого ему необходимо ввести команду ned stalya, пере¬ местить курсор в информационное поле , набрать требуемый текст и нажать клавишу ВВОД. После выполненных действий экран терминала примет вид: statya Alt 4 4 Lines Редактор текстов дает возможность 0001 ^айла, содержащие npor- 0002 раммы, тексты документов 0003 и т.п., а также вносить в них изменения. 0004 Просмотрев текст, пользователь легко обнаружит в нем ошибку. В тексте пропущена целая строка, а именно: перед строкой с номером 0002 должно быть записано: пользова¬ телю редактировать. Для того чтобы внести эту строку в текст, вам необходимо ввести в первой позиции поля нумерации команду i (т.е. набрать команду и нажать клавишу ВВОД): файлы, содержащие npor- i002 18
которая обеспечит вставку пустой строки перед строкой с номером 0002: i | Редактор текстов дает возможность i \файлы, содержащие прог- I : Теперь достаточно набрать во второй строке недоста¬ ющий текст и нажать клавишу ВВОД . В случае если необходимо добавить несколько строк текста (например, 11) перед некоторой строкой, то достаточно ввести в этой строке команду вида число__строкi (например, 11 i ) Если требуется добавлять строки после некоторой строки, то для этого используется строчная команда вида число__строка (например, 12a) Например, строчная команда a003 обеспечит вставку пустой строки после строки с номером 0003, а команда 23a - вставку 23 пустых строк после строки, в которой набрана данная команда. Аналогичный эффект можно получить и с помощью первич¬ ных команд, набираемых в поле команд редактора. Так, если необходимо вставить текст перед второй строкой, то достаточно в поле команд редактора ввести команду 2i (=> 2/), набрать требуемый текст и нажать клавишу ВВОД. Для вставки текста после некоторой строки может исполь¬ зоваться первичная команда следующего вида: номер^строкиа в которой в поле номер_строки указывается номер строки, после которой необходимо вставить текст. Заметим, что для перевода курсора в поле первичных команд достаточно нажать клавишу ПФ12. В процессе подготовки и редактирования статьи может потребоваться уничтожение одной строки или группы строк. Для уничтожения одной строки достаточно в поле нумерации этой строки ввести команду d. Для уничтожения группы 19 0001 | 0002 I 0003 I
строк требуется набрать команду dd в поле нумерации первой и последней строк уничтожаемой группы: —п В строках 12-23 записан неверный текст, ddl2| • . . i который уничтожается по команде dd dd23| Для этих же целей может быть использована и первичная команда вида адрес_1,адрес_2А которая предписывает уничтожить последовательность строк в файле, начинающуюся с номера, указанного в поле ad- pepec_l и заканчивающуюся номером, заданным в поле ад¬ рес _2. Пример 2.1. ==> 12,23A Помимо текста в статье могут присутствовать различные таблицы и другие вещи, подготовка которых требует много рутинной работы. Редактор текста включает команды, позволяющие размножать одну или несколько строк и, таким образом, создать, например, шаблоц таблицы. Так, команда вида число__повторенийт набранная в поле нумераций некоторой строки, повторяет ее столько раз, сколько указано в поле число-повторений. Для размножения группы строк необходимо в поле нумераций первой строки группы набрать команду rr, а в последней строке группы команду число^повторений rr: Скорость [ Время | Путь (км/ч. ) | (Ч.) | (КМ) 1 I п 0115 | 0116 | 0117 ^ 0118 | rrl9 J 5rr0 20
После нажатия клавиши ВВОД в тексте статьи, хранящей¬ ся в файле statya, будет создан шаблон таблицы из шести строк: Скорость (км/ч. ) Время (ч.) ПуТЬ (КМ) 0115 0116 0117 0118 0119 0132 0133 0134 0135 0136 В процессе редактирования файла пользователь может нечаянно ввести ошибочную команду или внести неверные изменения. Для восстановления состояния, предшествующего последней выполненной команды или последнему изменению текста, достаточно ввести команду и в поле первичных команд: ==> u Для перехода к фрагменту текста, начинающемуся с некоторого конкретного номера строки, достаточно ввести номер этой строки в поле команд редактора. Например, ввод в поле команд редактора числа 100 (= = > 100 ) вы- зывет появление на экране терминала текста, хранящегося в файле, начиная с 100-й строки. В том случае, если не известен номер требуемой строки, но известен текст из этой строки, для перехода к редактированию этой строки удобно воспользоваться пер¬ вичной командой контекстного поиска: /поисковый овраз/ Поисковый образ задается последователоностью символов (символьной строкой). Например, выполнение команды ==> /контекст/ 21
при редактировании данной рукописи привело к появлению на экране терминала текста, который Вы читаете на этой странице. Для просмотра фрагмента текста ниже или выше фраг¬ мента, отображаемого на экране, на n строк достаточно ввести в поле команд редактора соответствующее смещение: +смещение или -смещение. Так, +5 вызывает смещение текста на экране дисплея на 5 строк вверх, а -7 (= = > -7) - на 7 строк вниз. Для этих же целей могут также использоваться функциональные клавиши ПФ7 и ПФ8, нажатие которых вызывает стандартный сдвиг текста на экране на 11 строк вниз или вверх соответственно. В редакторе ned можно готовить документ шириной до 4096 символов. Естественно, если ширина документа пре¬ вышает ширину экрана, то пользователь может видеть толь¬ ко левые 76 символов. Признаком продолжения строки доку¬ мента за правой границей экрана является наличие символа * (звездочка) в первой позиции поля нумерации строки. Для просмотра или подготовки документа, ширина которого превышает размеры экрана, в редакторе предусмотрены как первичные, так и строчные команды сдвига текста на экране терминала на требуемое число символов вправо или влево. Для сдвига текста вправо или влево на n символов достаточно ввести в поле команд редактора соответственно следующие первичные команды: адрес__1, aApec_2L смещение и адрес__1, адрес__2И смещение В поле adpec_l задается номер первой строки смеща¬ емого фрагмента текста, а в поле adpec_2 - номер последней строки. В поле смещение указывается количество символов, на которые необходимо сдвинуть фрагмент вправо или влево соответственно. В том случае, если необходимо сдвинуть весь текст на экране терминала, поля adpecJ. и adpec_2 можно опускать. Пример 2.2. I i j==> R 34 | | В "ned'' Вы можете готовить доку * 01 | |Естественно, если ширина документа * 02 | |Вы можете видеть только левые 76 с * 03 | |строки документа за правой границе * 04 | |вола "*" (звездочка) в первой пози * 05 | l l 22
После выполнения команды R 34 экран дисплея примет нид: i i |мент шириной до 512 символов. 0001 | | превышает ширину экрана, то 0002 \ |имволов. Признаком продолжения 0003 | Iй экрана является наличие сим- 0004 | |ции поля нумерации строки. 0005 | l ! l Для смещения текста на экране терминала можно исполь¬ зовать строчные команды. Для смещения отдельной строки нправо или влево на некоторое число символов достаточно в ноле нумерации этой строки набрать команду смещение> или команду смещение< соответственно и нажать клавишу ВВОД. Для смещения фрагмента текста необходимо в поле нумерации первой строки фрагмента набрать символы >> (или <<), а в последней строке фрагмента - команду смещение>> (или смещение<<) и также нажать клавишу ВВОД. Пример 2.3. i==> В "ned" Вы можете готовить доку «01 |Естественно, если ширина документа * 02 I Вы можете видеть только левые 76 с * 03 I строки документа за правой границе * 04 \вола "*" (звездочка) в первой пози 34« Применение в данном примере строчной команды < < для сдвига текста на экране терминала приведет к результату, аналогичному применению первичной команды R в преды¬ дущем примере. Для этих же целей можно использовать так¬ же функциональные клавиши ПФ10 и ПФ11, нажатие которых вызывает стандартный сдвиг текста на экране на 8 симво¬ лов вправо или влево соответственно. При подготовке программы, документа часто приходится использовать ранее подготовленный материал, который хра¬ нится в отдельном файле. Для вставки этого материала в текст необходимо в поле первичных команд ввести команду вида 23
номер_строкиг иня_файла Эта команда обеспечивает считывание файла, имя кото¬ рого указано в поле iuinjpaiuta, и размещает его в редактируемом тексте после строки, номер которой задан в поле HOJuep_crpoKu. Команду r также удобно использовать для объединения нескольких файлов в один. Если в ходе редактирования файла потребуется пере¬ местить группу строк текста из одного места в другое, то удобно воспользоваться первичной командой: адрес__1, адрес_2m адрес^З где поля adpec_l и adpec_2 содержат номера первой и последней строк группы, а поле adpecJ$ - номер строки, за которой будет размещен перемещаемый текст. Может возникнуть ситуация, когда нужно не перемещать группу текста, а просто ее скопировать в другое место. В этом случае нужно воспользоваться первичной командой: адрес_1, адрес_21 адрес__3 Если требуется часть набранного текста сохранить в отдельном файле для последующего использования, то дос¬ таточно ввести первичную команду: адрес___1, адрес_2ч1 имя^срайла где поле uMajpaiuia содержит имя файла, в который будет скопирована последовательность строк, начинающаяся с но¬ мера, заданного в поле adpec_l, и заканчивающаяся адре¬ сом, указанным в поле adpec_2. Так, для сохранения сфор¬ мированной выше таблицы в файле tabl требуется ввести в поле команд редактора следующую команду: ==> 115,136w tabl Эту же команду удобно использовать для разбиения большого файла на несколько файлов меньшего размера или для получения копии редактируемого файла. Довольно часто возникает ситуация, когда в тексте необходимо заменить один или несколько символов на дру¬ гие символы. Для этого используется первичная команда: 24
адрес__1, адрес_2ь/заменяемые_символы/замещающие_сим- волы/g Например, команда ==> 1,$5/ЮНИКС/М0С/g обеспечит замену всех вхождений (символ g), начиная с первой строки файла и кончая последней (символ $), символьной строки ЮНИКС на текст MOC. В ходе редактирования может возникнуть потребность добавить некоторый текст до и (или) после некоторой под¬ строки строки. Например, при подготовке данной рукописи авторам пришлось в готовый текст добавлять символы ЕС после подстроки MOC. Естественно, что такую редакцию можно выполнить, используя командуй обычного формата: ==> l,$s/MOC/MOC ЕС/g В этом случае пришлось последовательность символов MOC набирать дважды. В том случае если последователь¬ ность символов является достаточно грамоздкой, то это оказывается не совсем удобным. В редакторе ned существу¬ ет специальный символ & (амперсенд), который позволяет избежать этого. Появление символа & с предшествующими и (или) последующими символами в поле замещающие символы команды s предписывает вставить эти символы в обрабаты¬ ваемом тексте перед и (или) после символов, указанных в моле замечаемые символы. С применением символа & преды¬ дущий пример примет вид: ==> l,$s/MOC/& ЕС/g Если требуется, например, вставить перед текстом MOC последовательность символов НИЦЭВТ, а после него символы ЕС, то достаточно выполнить следующую команду: ==> 1,$5/МОС/НИЦЭВТ & ЕС/g Следует иметь в виду, что если добавляемые символы должны составлять единое слово совместно с символами, к которым они добавляются, то между знаком & и добавляемы¬ ми символами не должно быть пробелов. 25
С помощью команды s можно также проводить переста¬ новку отдельных символов или подстрок в строке. Предположим, что в файле хранятся следующие данные: i 1 • • • | С.И. сурнов 1953 CHC I Л.Я. Стерехова 1951 техник | В.А. Комарчук 1948 МНС | l Пусть требуется переформатировать содержимое файла таким образом, чтобы слева шло наименование должности, затем фамилия и инициалы сотрудника, занимающего эту должность, и год рождения: i 1 i i I CHC Сурнов С.И. 1953 | I техник Стерехова Л.Я. 1951 | | МНС Комарчук B.A. 1948 | I I I I Суть перестановки заключается в следующем. В поле заменяемые символы команды s необходимо задать разбиение строки файла на ряд подстрок. Все подстроки условно можно разделить на два типа: участвующие в перестановке и игнорируемые. Каждая участвующая в перестановке подстрока должна быть заключена в специальные символы \( и \). Подстроки, заключенные в символы \( и \), называются этикетками, или тегами. Подстрока внутри этикетки зада¬ ется некоторым шаблоном, позволяющим однозначно выделить подстроку в строке. Каждая этикетка получает номер в порядке их перечис¬ ления слева направо. Для перестановки этикеток необхо¬ димо перечислить их номера в требуемом порядке в поле зсшещающие символы команды s, при этом каждому номеру должна предшествовать обратная косая черта (\). В общем случае формат поля команды s, стоящего правее символа s, имеет вид: /Щ1и1]\(Ш1\)...Щ1ш]\(Ш1\)..у\Мэ1... \Nai.../g, 26
где Шш - шаблон i-го игнорируемого поля (может отсут¬ ствовать, на что указывают квадратные скобки, в которые он заключен); LLtei - шаблон i-го поля, участвующего в перестановке; \(Шэ1\) - i-я этикетка; \№i - номер i-й этикетки. В нашем примере должны быть выделены четыре этикетки: 1) инициалы; 2) фамилия; 3) год рождения; 4) должность, а также разделяющие их подстроки. Шаблон может задаваться как явно в виде конкретных символов, так и генерироваться из так называемых мета¬ символов. В качестве метасимволов в редакторе ned выступают следующие символы: . (точка) - любой единичный символ; * (звездочка) - повторитель символа; [...] - любой единичный символ из последовательности символов, заключенной в квадратные скобки; p...] - любой единичный символ, (символ Л, который имеет смысл "не” только в данной конструкции) не принад¬ лежащий последовательности символов, заключенной в квад¬ ратные скобки; Л - начало строки. Символ Л в MOC ЕС для устройств типа ЕС 7920 кодирует¬ ся символами Vn (обратная косая черта, логическое "не"). К метасимволам также относится и рассмотренный выше символ &. Рассмотрим некоторые примеры использования метасимволов: a.b - любая последовательность из трех символов, начинающаяся символом а и заканчивающаяся символом b (например, acb, a4b); а* - любая последовательность символов а (например, a,aa, aaaaa); .* - любая последовательность любых символов, в том числе и рассмотренные в предыдущих примерах; [a2d] - любой из символов а, 2 или d; pa-z]* - любая последовательность символов, не вклю¬ чающая строчные латинские буквы (например, 123, ZOMBI и т.д.). В последнем примере символ - (тире) замещает промежу¬ точные значения, т.е. строчные буквы b, с, d и т. д. Если же символ - стоит в конце последовательности, то он теряет специальный смысл и рассматривается как обычный символ. В квадратных скобках теряют специальный смысл 27
все метасимволы. Следовательно, конструкция [\*. &] соответствует любому из символов \, *,. или &. В связи с тем, что метасимволы . , *, [, \, & и могут встречаться в тексте или в символьных константах (например, в команде контекстного поиска), то в этом случае требуется отменить их специальный смысл. Для отмены специального смысла метасимволов достаточно про¬ вести их маскирование, заключающееся в установке непос¬ редственно перед метасимволом обратной косой черты (\). Например, для того чтобы начать редактирование файла со строки, в которой есть цепочка символов *НАЧАЛО*, необходимо ввести команду вида ==>/\*НАЧАЛО\*/ Ввод же команды ==>/*НАЧАЛО*/ может привести к отображению на экране терминала совсем другого участка файла, например включающего подстроку =HA4AAO = . Однако вернемся к примеру, связанному с перестанов¬ ками в строке. Команда, обеспечивающая требуемую пере¬ становку, имеет вид: 1,$s/*vr ]*\) *WA ]*\) *\<[i-9]*\) *Vr ]*\)/ \4 \2 \1 \3/д где / - начало поля заменяемъм символы, Л - метасимвол начало строки, предписывающий начать обработку с начала строки; \( - начало первой этикетки; p ] - цепочка символов, не содержащая пробелов (инициалы); \) - конец первой этикетки; * - цепочка пробелов (не участвующая в перестановке) между инициалами и фамилией \( - начало второй этикетки; p ]* - цепочка символов, отличных от пробела (фами¬ лия); \) - конец второй этикетки; * - цепочка пробелов между фамилией и годом рожде¬ ния; [1 - 9]* - цепочка цифр (год рождения); 28
\) - конец третьей этикетки; * - цепочка пробелов между годом рождения и долж¬ ностью; \( - начало четвертой этикетки; P ]* - цепочка любых символов, отличных от пробела (должность); \) - конец четвертой этикетки; / - конец поля заменяемые символы и начало поля ммещающие символы; \4- в новой структуре строки сначала идет четвертая пикегка (должность), после цифры четыре следует пробел для отделения должности от фамилии; \2 - фамилия; \1 - инициалы; \3 -годрождения; / - конец поля заменяемые символы; g - переформатировать весь заданный участок файла. Рассмотрим еще один пример. Пусть файл содержит стро¬ ки длиной 40 байт. В процессе редактирования потребова¬ лось оставить первые десять байт без изменения, а сле¬ дующие двадцать байт переставить в конец строки: 1 10 11 - 30 31 40 1 2 3 1 10 11 2C ) 21 40 1 3 2 Для перестановки необходимо сформировать три этикет¬ ки: первую этикетку независимо от того, какие в нее входят символы длиной 10 байт, вторую - длиной 20 байт и третью -10 байт. Если использовать метасимвол . , то его необходимо повторить столько раз, сколько символов в этикетке: \( \Л( \)\( \; Чтобы исключить такое повторение в редакторе ned 29
допускается использование повторителей. Повторитель за¬ дается одним из трех способов: \ \ {т \ \} ' повторить символ ровно m раз; \ \ (т> \ \} ~ повторить символ не менее m раз; \\{т,п\\} - повторить символ в пределах от m до n раз. С использованием повторителей строка этикеток для нашего примера примет вид: \(.\10\}\)\(Л{2°\}\)\(Л{10\>\) первая вторая третья этикетка этикетка этикетка Сама команда перестановки будет иметь вид: ==> 1,$5/\(.\{10\}\)\(.\{20\}\)\(.\{10\}\)/\1\3\2/д Пробелов или других символов между номерами этикеток не должно быть. В противном случае они будут вставлены в текст. Остановимся еще на одной возможности редактора ned, а именно на выполнении команд монитора shell без выхода из редактора. Для того чтобы выполнить команду монитора sheU, которая никак не связана с редактируемым файлом, доста¬ точно в поле первичных команд ввести символ ! (воскли¬ цательный знак) и непосредственно за ним имя требуемой команды, например: = = = > !who В случае если предполагается обработать некоторый участок редактируемого файла той или иной командой монитора, то необходимо выполнить первичную команду вида адрес__1, адрес_2! >имя_команды__монитора Пример 2.4. ===> 23,76!>sort В данном примере будет проведена сортировка (команда sort) участка редактируемого файла с 23-й строки по 76-ю строку. Результат выполнения данной команды в редактиру¬ емый файл не включается. 30
Если требуется выполнить некоторую команду и резуль¬ тат ее выполнения включить в редактируемый файл после некоторой строки, то выполняется командавида: ==> адрес__строки!<имя_команды Пример 2.5. ==> 20!<who После выполнения данного примера в редактируемый файл после строки с номером 20 будет включен перечень актив¬ ных в данный момент пользователей MOC ЕС. Если же некоторый участок файла необходимо обработать некоторой командой монитора и результат обработки помес¬ тить на то же место, то требуется выполнить команду следующего вида: адрес__1, адрес_2 / | имя__команды Символ | обозначает так называемый конвейер, о чем речь (как, кстати, и о символах < и >) ниже, и в MOC ЕС для устройств типа ЕС 7920 кодируется парой символов \ (обратная косая черта) и / (восклицательный знак). Пример 2.6. ==> 20,43!|sort В данном примере предполагается сортировка участка редактируемого файла с 20-й по 43-ю строку и подстановка результата сортировки на этот же участок файла. Сохранение набранного текста или внесенных изменений в файл достигается выполнением первичной команды w (например, = = > w ). Впрочем, рекомендуется вводить команду w периодически в процессе редактирования файла с целью избежания потери набранного на экране терминала текста или внесенных изменений при возможных сбоях маши¬ ны. Отметим также, что за один сеанс пользователь может подготовить только часть текста, а оставшуюся часть - в последующих сеансах. Для выхода из редактора достаточно ввести первичную команду q в поле команд редактора или нажать клавишу ПФЗ. Для распечатки текста, хранящегося в файле, достаточ¬ но ввести команду opr имя__файла 31
Пример 2.7. $ opr statya $ С помощью редактора ned пользователь может изменить стандартную символику приглашения на ввод команд монитора sheU на любую по своему усмотрению. Символика приглашения, стандартное распределение функциональных клавиш ПФ1 - ПФ12, а также многое другое хранится в так называемом профиле пользователя системы MOC ЕС. Про¬ филь пользователя хранится в файле со следующим именем: /mntsys/uwc/аБонент/.../profile где поле абонент содержит регистрационный номер пользо¬ вателя. Так, для пользователя, имеющего регистрационный номер b513, профиль хранится в файле с именем /mntsys/ uwc^513/.../profile. Подробно правила именования файлов излагаются в гл. 4. Внести необходимые изменения в свой профиль пользователь может с помощью редактора ned. Для этого сначала необходимо выполнить команду ned /mntsys/uwc/b513/.../profile После выполнения этой команды на экране терминала пользователя, имеющего регистрационный номер b513, поя¬ вится его профиль: LOGNAME=‘logname' PSl="$" Pf 1 ps -a2s / Pf 2 cat /etc/ident ity,who Pf 6 logoff Pf 12 Теперь для изменения символики приглашения достаточно во второй строке файла заменить текст на любой другой, например PS1 ="- ГОТОВО ->". Аналогично пользователь может провести закрепление за функциональными клавишами 32
ПФ1 - ПФ12 выполнение тех или иных команд. Например, ес¬ ли пользователь часто пользуется "электронными” почтой и телефоном, то, чтобы каждый раз не набирать команды просмотра регистрационных номеров пользователей, заре¬ гистрированных в системе {cat /etc/identity) и работаю¬ щих в данный момент (who), целесообразно закрепить эти функции за одной из клавиш (например, ПФ2), внеся соответствующие изменения в профиль. Аналогичным образом можно закрепить, например, за клавишей ПФ6, выполнение команды logoff, закрывающей сеанс работы с системой. После внесения всех изменений в профиль необходимо их сохранить путем выполнения первичной команды w. Теперь, чтобы внесенные изменения начали "работать", необходимо завершить сеанс работы с системой (команда logojf) и войти в систему заново. Выполнив эти действия, j пользователь убедится, что теперь приглашение на ввод |. команд выглядит в виде строки - ГОТОВО ->, а для t выполнения команд cat /etc/identity и who достаточно \ нажать клавишу ПФ2. Завершить сеанс работы пользователь b513 также теперь может путем нажатия функциональной клавиши ПФ6. Для того, чтобы внесенные в профиль изменения начали | "работать", можно также воспользоваться командой newgrp. Пример 2.8. I * i newgrp | - ГОТОВО -> i В дальнейшем будет показано, как можно оперативно изменять символику приглашения во время сеанса работы без модификации файла профиля пользователя. Коротко остановимся на рассмотрении основных возмож¬ ностей построчного редактора текстов ed, который по многим выполняемым функциям аналогичен редактору ned. При этом команды редактора ed полностью идентичны первичным командам редактора ned. Однако в отличие от ned редактирование файла в среде ed ведется в построчном режиме: пользователь вводит команды редактирования в командной строке монитора sheU (по аналогии с полем первичным команд редактора ned), которые перехватываются и выполняются редактором ed. Вызов редактора ed осущест¬ вляется командой ed [флаги] имя_редактируемого файла 2 Заказ № 1154 33 f
После того как выдана команда ed, файл, подлежащий редактированию, копируется в рабочую область редактора, в качестве текущей строки устанавливается последняя строка файла и редактор выдает приглашение на ввод команд. Работу с редактором ed рассмотрим на примере команд p (читать) и с (изменить), которые отсутствуют в ned. Команды p и с, как и большинство других команд редактора ed, имеют формат: адрес_1,адрес_2р адрес__1, адрес_2с Адреса могут задаваться как явно, так и с использо¬ ванием специальных символов ."." (точка) и $. Символ "." указывает на номер текущей строки, а символ $ - на номер последней строки в файле. Примеры. 1,5 - с 1-й по 5-ю строки; .,$ - с текущей по последнюю строки; .-l,$-3 с предыдущей от текущей до 4-й строки с конца файла. Напомним, что строка может быть установлейа в качестве текущей путем ввода ее номера: 5 - установить текущей строку с номером 5; .-1 - установить текущей предыдущую строку; - установить текущей последнюю строку файла. При установлении текущей строки ее содержимое отобра¬ жается на экране терминала. Команда p позволяет считать участок редактируемого файла (который хранится в рабочей области), начиная со строки, номер которой задается в поле adpec_l и кончая строкой, номер которой указан в поле adpec_2, и направить его в так называемый стандартный вывод (в нашем случае это экран терминала). Пример 2.9. -ГОТОВО-> ed sotrudnik >l,2p Блажнов В.Ю.,1949,HA,KTH,200 34
Барвин О.А.,1961,MHC,KTH,170 >l,$p Блажнов В.Ю.,1949,НЛ,КТН,200 Барвин O.A.,1961,MHC,KTH,170 Стерехова Л.Я.,1951,техник,,120 Комарчук В•А•,1949,CHC,,180 >Я -ГОТОВО-> В данном примере команда q, так же как и в редакторе r ned, обеспечивает выход из редактора. Команда с предназначена для замены некоторого участка текста на новый. По команде с редактор уничтожает задан¬ ный участок текста и ждет ввода новых строк. Пользова¬ тель последовательно вводит новые строки в командной строке монитора. При этом количество вводимых строк ; может не совпадать с числом уничтоженных строк. Приз¬ наком окончания ввода новых строк (так же как и при вводе строк при выполнении команд a (добавить после) и i (добавить перед)) служит ввод символа . (точка) в первой позиции командной строки. Пример 2.10. . -ГОТОВО-> ed sotrudnik ! > ^/$P Блажнов В.Ю.,1949,НЛ,КТНГ200 Барвин О. А • , 1961,МНСfКТH,170 r Стерехова Л.Я.,1951,техник,,120 [ Комарчук В•А•,1949,CHC,,180 \ >2,3c Воинов И.О*,1949,MHC,,180 >i,$p Блажнов В.Ю.,1949,НЛ,КТН,200 Воинов И.О*,1949,МНС,,180 Комарчук B.A.,1949,CHC,,180 >w >Я -ГОТОВО-> ! j I В редакторе ed (так же как и в редакторе ned) нельзя забывать об использовании команды w, которая обеспечи- j вает сохранение отредактированного файла. В редакторе ed, так же как и в редакторе ned, могут 2* 35
использоваться метасимволы для задания шаблонов (напри¬ мер, команда контекстного поиска или команда s). Единственное отличие заключается в том, что в редакторе ed не допускается использование повторителей. Отличительной особенностью редактора ed является возможность подготовки программы редактирования в виде последовательности команд в отдельном файле с последую¬ щим указанием редактору выполнить эту программу: ed [флаги] ред_файл<ком__<райл , где поле pedjpaiui содержит имя подлежащего редактирова¬ нию файла, а поле ком_файя - имя файла, содержащего команды редактора. Аналогичным образом можно дать указания редактору для записи его сообщений не на экран терминала, а в некоторый файл: ed [флаги] ред_файл<ком__файл>рез_файл , где в поле pe3jpaiut задается имя файла, в который будут записываться все сообщения редактора. При этом необходи¬ мо различать редактируемый файл и сообщения редактора, это вещи разные. Пример 2.11. -готово-> cat komfile 1, $P 4d За Жилин В.А.,1966,инженер,,160 l,$P w Я -ГОТОВО-> ed sotrudnik<komfile>resfile -ГОТОВО-> cat resfile 130 Блажнов В.Ю.,1949,НЛ,КТН,200 Барвин О.А.,1961,МНС,КТH,170 36 >
Стерехова Л.Я.,1951,техник,,120 Комарчук B.A.,1949,CHC,,180 >» Блажнов В.Ю.,1949,НЛ,КТН,200 Барвин О•А.г1961,МНС,КТH,170 Стерехова Л.Я.,1951,техник,,120 Жилин В.А.,1966,инженер,,160 >128 -ГОТОВО-> Отметим, что, задав ключ (-) при вызове редактора ed, можно подавить выдачу им пояснительных сообщений (напри¬ мер, объем файла в символах, приглашение > ). Пример 2.12. -ГОТОВО-> ed - sotrudnik<komfile>resfile -ГОТОВО-> cat resfile Блажнов В.Ю.,1949,НЛ,КТН,200 Барвин O.A.,1961,MHC,KTH,170 Стерехова Л.Я.,1951,техник,,120 Комарчук В.А•,1949,CHC,,180 Блажнов В.Ю.,1949,НЛ,КТН,200 Барвин O.A.,1961,MHC,KTH,170 Стерехова Л.Я.,1951,техник,,120 Жилин В.А.,1966,инженер,,160 -ГОТОВО-> Редактор ed может оказать неоценимые услуги при разработке программ на языке sheU, но об этом пойдет речь во втором разделе. Глава 3. ФАЙЛЫ, КАТАЛОГИ, РАЗГРАНИЧЕНИЕ ДОСТУПА Как уже отмечалось, пользователь в системе MOC ЕС всегда работает с файлами, в которых хранятся как прог¬ раммы, так и различная текстовая информация. В процессе работы у пользователя может оказаться несколько десятков 37
различных файлов, и ему становится трудно разобраться, что в каком файле хранится. Чтобы избежать такой путани¬ цы, в системе MOQ, ЕС файлы объединяются в файловую систему, которая имеет иерархическую структуру с поиме¬ нованными узлами-каталогами. Для системы и для пользова¬ теля каталог представляет собой обычный файл, в котором хранятся имена входящих в нет файлов (в том числе и его подкаталогов) и системная информация (номера индексных дескрипторов файлов), связанная с хранением файлов на магнитных дисках. Однако в отличие от обычных файлов пользователь может записать или изменить содержимое каталога только с помощью специальных команд системы. Рядовой пользователь системы работает, как правило, с текстовыми файлами и каталогами, физическая организация системы скрыта от него. В данной главе будут рассмотрены основные команды монитора shell по работе с каталогами. Организация файловой системы будет рассмотрена в третьем разделе. На рис. 3.1 приведен фрагмент файловой системы поль¬ зователя, которая включает начальный каталог K1 и два его подкаталога Kll и K12. В каталоге K1 содержатся файлы fll, fl2 и fl3, а в каталоге K12 - файлы fl21, fl22 и fl23. Рис. 3.1. Фрагмент файловой системы Файловая система позволяет объединять в группы файлы, связанные общей тематикой. Так, можно создавать каталоги программ линейного программирования, имитационного моделирования и т.п. Примером такого объединения в самой системе MOC ЕС могут служить каталог Д>т, содержащий основные команды монитора shelL или каталог /etc, в 38
котором сгруппированы команды администратора системы (суперпользователя системы). На основе файловой системы можно создавать также и простые базы данных. Начальный каталог файловой системы пользователя создается при включении его администратором в число пользователей системы MOC ЕС. Чтобы узнать полное имя начального каталога пользователя, достаточно после входа в систему выполнить командуpwd. Пример 3.1. -ГОТОВО-> pwd /mntsys/uwc/b513 -ГОТОВО-> Символьная строка /mntsys/uwcft)513 указывает маршрут от корневого каталога файловой системы MOC ЕС (самый левый символ f) через его подкаталог mntsys и, в свою очередь, через подкаталог uwc - к файловой системе конкретного пользователя, зарегистрированного с номером b513. В качестве разделителей имен каталогов использует> ся символ / (косая черта). Аналогичным образом указывается полное имя любого файла (напомним, что каталог - это тоже файл). Так, полное имя файла sfatya из примера в предыдущей главе имеет вид: /mntsys/uwc/b513/statya Однако если текущим каталогом является каталог /mntsys/uwcyb513, то к любому файлу этого каталога можно обращаться непосредственно по его имени в этом каталоге (как это и делалось в предыдущих главах), т.е. просто statya. При обращении к файлу, который содержится в некотором подкаталоге текущего каталога, также нет необходимости указывать полное имя файла. Достаточно указать имя подкаталога и через символ / (косая черта) имя требуе¬ мого файла. Так, если текущим каталогом является каталог /mntsys/uwc/b513, то для корректировки профиля пользова¬ теля (см. гл.2) достаточно выполнить команду вида ned .../profile В данном примере подразумевается, что каталог с име- 39
нем "..." (три точки) является подкаталогом текущего каталога. Отметим, что корневой каталог файловой системы пользователя становится текущим в момент входа в систему. Однако пользователь по своему желанию может потребовать автоматической установки при входе в систему в качестве текущего каталога любого другого каталога. Для этого достаточно в профиль пользователя (см. гл. 2) после распределения функциональных клавиш записать команду cd с именем требуемого каталога. Пример 3.2. LOGNAME='logname' PSl="-rOTOBO->" Pf 1 ps -als Pf 2 cat /etc/identity;who Pf 12 cd /mntsys/uwc/b513/TH Теперь при последующих входах пользователя в систему текущим каталогом автоматически будет становиться ката¬ лог с именем /mntsys/uwc/b513/TH. Отметим, что аналогичным образом пользователь может обеспечить автоматическое выполнение любых команд MOC ЕС при входе в систему. Например, если в профиль записать команду date, то при входе в систему на экране терминала пользователя будет отображаться текущее время. Количес¬ тво строк с командами в профиле неограничено, при написании нескольких команд в одной строке их необходимо разделять символом ; (точка с запятой). Просмотреть содержимое каталога можно, воспользовав¬ шись командой вида ls имя_каталога Для просмотра содержимого текущего каталога доста¬ точно выполнить команду ls без указания его имени. Прежде чем приступить к более подробному рассмотре¬ нию работы с каталогами, дадим несколько полезных советов. Для удобства работы с системой в каждом ка¬ талоге (подкаталоге) целесообразно создавать информа¬ ционный файл (скажем, с именем ogl), в котором будет 40
храниться краткая аннотация содержимого файлов и назначение подкаталогов данного каталога. Для того чтобы отличать каталоги от обычных файлов, удобно имена каталогов писать прописными буквами (например, K1, TH), а файлов - строчными (например, fll, statya). Рассмотрим работу с каталогами на примере создания справочной базы данных по теории вероятностей на основе книги А.С.Солодникова "Теория вероятностей" (M.: Просве¬ щение, 1983. - 207c.). Данную базу данных (БД) будем создавать в виде двухуровневой файловой системы. На первом уровне создается каталог с именем ТВ (тео¬ рия вероятностей) и четыре файла (ogl, cod, bb, lit), назначение которых будет раскрыто ниже. Для создания каталога требуется выполнить команду mkdir имя__срайла [имя__каталога] ... Полное имя каталога (в нашем примере /mntsys/uwc/ b513/TB) требуется указывать только в том случае, если создается каталог на вышестоящих уровнях или в парал¬ лельных ветвях файловой системы. Если же создается подкаталог текущего каталога (в нашем примере /mntsys/ uwc/ b513), то достаточно указать его имя в данном каталоге: mkdir ТВ Заметим, что при создании каталога файловой системы в нем автоматически создаются для удобства работы два стандартных файла с именами . (точка) и .. (две точки). В файле с именем . (точка) хранится ссылка на вновь созданный каталог (т.е. ссылка на самого себя), а в файле с именем .. (две точки) - ссылка на родительский каталог, т.е. на каталог, подкаталогом которого он яв¬ ляется. Для входа в существующий или вновь созданный каталог необходимо выполнить команду: cd имя__каталога Пример 3.3. -ГОТОВО-> cd /mntsys/uwc/b513/TB -ГОТОВО-> pwd 41
/mntsys/uwc/b513/TB -ГОТОВО-> Однако для входа в подкаталог текущего каталога (в нашем примере /mntsys/uwcfo513) достаточно указать только имя подкаталога, т.е. вместо команды cd /mntsys/ uwcyb513/TB достаточно было записать cd ТВ. В нашем примере в каталогу ТВ, как отмечалось выше, создаются четыре файла. Для создания этих файлов можно воспользоваться редакторами текстов (см. гл. 2) и коман¬ дой cat (см. гл. 1). В файл ogl записывается информация о назначении данного каталога и содержимом его файлов: -готово-> cat>ogl Каталог ТВ содержит справочную вазу данных по курсу T E О P И И В E P О Я T H О С T E Й Файл 1it содержит литературу по курсу В файле bb дается введение к курсу Файл cbd содержит описание вазы данных Для просмотра лювого из указанных файлов введите команду видагпес! имя^файла [НАЖМИТЕ ВЫЗОВ ТЕСТА] -ГОТОВО-> Аналогично в файл lit заносится список литературы, а вфайлЬЬ - введениеккурсу. В файл cod записывается справочная информация о раз¬ делах курса и имена каталогов, в которых они хранятся. Пример 3.4. -ГОТОВО-> ed cod 0 > а О Г А А В Л E H И E К У P С А Раздел 1. Совытия и их вероятности - каталог RAZl. Раздел 2. Комвинаторика - каталог RAZ2. Раздел 9. Элементы математической статистики - RAZ9. Для просмотра того или иного каталога тревуется войти в него по команде cd имя^каталога и просмот¬ реть его описание в файле ogl по команде ned ogl . 42
> w 14 > Я -ГОТОВО-> В данном примере для подготовки файла cod мы восполь¬ зовались строчным редактором текстов ed (см. гл. 2). Каталоги RAZ1 - RAZ9, являющиеся подкаталогами теку¬ щего каталога ТВ, создаются командой mkdir RAZ1 RAZ2 RAZ9 или, если воспользоваться метасимволами (см. гл. 2), командой mkdir RAZ[l-9] Для создания файлов в каждом из этих каталогов необходимо прежде всего войти в него, например: Cd RAZ1 В каждом из каталогов RAZ[l-9] создается свой файл оглавления ogl с описанием его файлов и по одному файлу на каждый подраздел раздела курса. Содержимое файла ogl в каталогах RAZ[l-9] строится аналогично файлу ogl в каталоге ТВ. Пример 3.5. -ГОТОВО-> cat>/mntsys/uwc/b513/TB/RAZl/ogl О Г Л А В Л E H И E P А 3 Д E Л А 1 СОБЫТИЯ И ИХ ВЕРОЯТНОСТИ 1.1. Интуитивный ПОДХОД К ПОНЯТИЯМ случайного СОБЫ¬ ТИЯ и вероятности - файл razll 1.5. Геометрические вероятности - файл razl5 Для просмотра файлов raz воспользуйтесь командой ned имя^файла . Для просмотра файла ogl каталога ТВ воспользуй¬ тесь командой ned ../ogl . Для перехода в другой раздел воспользуйтесь командой cd ../имя^каталога, содержащего тревуемый раздел. 43
Для возврата в каталог ТВ выполните команду вида: cd . . [ВЫЗОВ ТЕСТА] -ГОТОВО-> После того как сформированы файлы в каталоге RAZ1, можно приступать к формированию файлов каталога RAZ2 и других. Для этого требуется прежде всего войти в него, выполнив команду cd с указанием в ней полного имени каталога: cd /mntsys/uwc/b513/TB/RAZ2 что, естественно, не совсем удобно. Выше уже отмечалось, что npri создании любого каталога создается файл с именем .. , где хранится оглавление вышестоящего каталога. Таким образом, для возврата к предыдущему уровню (в нашем примере каталог ТВ) доста¬ точно выполнить команду cd . . а затем для входа в каталог RAZ2 - команду cd RAZ2 Однако и эту операцию можно упростить, объединив обе команды в одну: cd ../RAZ2 что эквивалентно указанию полного имени каталога RAZ2. Формирование каталогов RAZ3-RAZ9 осуществляется ана¬ логично. Если вы забыли, какой каталог является текущим, то выполните команду pwd. Таким образом, после того как файлы будут сформи¬ рованы в каталоге RAZ9, пользователь заканчивает соз¬ дание справочной базы данных по теории вероятностей. Для удобства работы с такой БД целесообразно в создаваемые файлы вносить справочную информацию (посмот¬ рите внимательно, как это сделано в наших примерах) о командах, которые должен выполнять пользователь при работе с ней. Работа с базой данных достаточно проста. 44
После начала работы с системой средствами редактора ned просматривается файл ogl, из которого пользователь узнает, что каталог ТВ является справочной БД по теории вероятностей. Там же он найдет подсказку о том, как с ней работать. В частности, ему сообщается, что прежде всего необходимо выполнить команду cd ТВУ а затем команду ned ogl. Ознакомившись с содержимым файла ogl, пользователь узнает, где какие разделы курса хранятся и как их просмотреть. Можно частично автоматизировать работу с БД, закрепив за одной из функциональных клавишей (например, ПФ8) в профиле пользователя команды входа в каталог ТВ и просмотра файла ogl, например: pf 8 cd /mntsys/uwc/b513/TB;n од1 Теперь для начала работы с базой данных, каким бы у пользователя не был текущий каталог, достаточно нажать клавишу ПФ8. Отметим также, что возврат в начальный каталог файловой системы пользователя осуществляется по команде cd, что эквивалентно выполнению команды cd /mntsys/uwc/b513 Для уничтожения каталога служит команда rmdir имя^каталога [имя_каталога] ... Особенностью этой команды является то, что она уничтожает только пустой каталог, т.е. такой каталог, который не содержит пользовательских файлов и подката- логов. Уничтожаемый каталог также не может быть текущим. Для того чтобы каталог стал пустым, необходимо уничто¬ жить все файлы, созданные в этом каталоге. О том, как уничтожить файл, и других командах работы с файлами речь пойдет в следующей главе. А теперь рассмотрим такой важный момент, как защита файловой системы пользователя от несанкционированного доступа. Защита файловой системы заключается в разграничении полномочий по использованию файлов и каталогов между их владельцами, группами, в которые могут объединяться пользователи, и всеми остальными пользователями системы. Владельцем файла (каталога) является тот пользователь, который его создал. Отдельные пользователи системы, 45
занимающиеся, например, разработкой информационно-спра¬ вочной системы или пакета прикладных программ, могут быть объединены администратором системы в группу, кото¬ рой присваивается соответствующий идентификатор. Опре¬ делить принадлежность пользователя той или иной группе можно, просмотрев файл /etc/identity и /etc/ passwd. Пример 3.6. -готово-> cat /etc/identity -польз.-ид.пол/ид .rp-...-тел. -... ФИО a515 530|2 24-83 Сурнов С.И. a517 533/2 26-14 Жилин B.A. a520 591/1 24-83 Шикуть B.E. a523 435/2 24-83 Стерехова л.я. d013 521/4 26-61 Петрова T.B. В данном примере пользователи a514 и a520 принадлежат к 1-й группе, пользователи a515> a517 и a523 - ко 2-й, а пользователь d013 - к 4-й группе. Состав группы и ее символьное имя можно узнать, просмотрев содержимое файла /etc/group. Пример 3.7. -готово-> cat /etc/group useri:1:a514,a5l2 super::3:root,bin,adm ingresx :5:ingres о115::2:a523,raja,adm,a515,a517,a512 o72::4:dl06,d013,dl09 -ГОТОВО-> В данном примере в состав 1-й группы (символьное имя user) входят пользователи a514 и aJ12, а в состав группы 3 (символьное имя super) - пользователи root, bin и adm. Отметим, что один и тот же пользователь может входить в состав нескольких групп (см. пользователь a512). Разграничение доступа к файлу включает полномочия по чтению, изменению (в том числе и уничтожению) и (или) выполнению файла отдельно для его владельца, группы, к которой принадлежит владелец, и остальных пользователей системы. 46
Первоначальное разграничение доступа к файлу устанав¬ ливается в момент его создания. Так, для текстового файла в момент его создания устанавливаются следующие права по его использованию: владелец и группа, к которой он принадлежит, имеют право читать и изменять файл, а все остальные пользователи - только читать. Для заг¬ рузочных модулей, создаваемых при трансляции исходных текстов программ, устанавливаются следующие полномочия: владелец и группа имеют права на чтение, изменение и выполнение файла, а все остальные пользователи - права на чтение и выполнение. Просмотреть текущие права пользователя по доступу к конкретному файлу или каталогу можно, воспользовавшись командой ls с флагом -/. При этом также будет выдана информация о владельце файла, времени его создания или последней модификации и его объем в байтах (символах). Пример 3.8. -ГОТОВО-> ls -1 /mntsys/uwc/a513 п_J3_<3_B_a владелец овьем дата_ соз имя drwxrwxr-x b513 336 Jan 31 19: 31 КНИГА -rw-rw-r— b513 60 Jan 29 17:13 bbb -rw-rw-r— b513 179 Jan 31 15:40 сотрудник -rwxrwxr-x b513 180 Jan 30 15:32 а. out -rw-rw-r b513 112 Jan 28 10:20 должность drwxrwxr-x b513 384 Jan 31 18:52 ПРОГРАММЫ -ГОТОВО-> В результате выполнения данного примера будет полу¬ чена таблица с характеристиками файлов (подкаталогов) с указанием их владельцев. Первый символ в этой таблице определяет тип файла: - - обычный файл; d - каталог; b - блокориентированный специальный файл; с - байториентированный специальный файл. Так, в данном примере файлы КНИГА и ПРОГРАММЫ - это подкаталоги каталога /mntsys/uwc /b513, а файлы a.out, должность, сотрудник и bbb - обычные файлы. Специальные файлы будут рассматриваться в гл. 9. Остальные девять символов представляют три набора по три символа. Первый набор определяет права владельца, второй - группы и третий - всех остальных пользователей. 47
В каждой из этих наборов первый символ (r) определяет право чтения файла, второй (w) - его изменения, а третий (x) - право выполнять файл. Для каталогов права на чтение, изменение и выполнение имеют несколько иной смысл, чем для обычных файлов. Право чтения каталога позволяет пользователю только просматривать имена входящих в его состав файлов, право на изменение - создавать новые файлы в каталоге или уничтожать уже существующие (с учетом прав на доступ к ним), право на выполнение - заменять каталог, осущест¬ влять в нем поиск и копировать из него файлы. По умолча¬ нию при создании каталога устанавливаются следующие полномочия по его использованию: владелец и группа имеют права в полном объеме, а все остальные пользователи - права по чтению и изменению. Для изменения полномочий по доступу к файлам (в том числе и каталогам) служит команда chmod следующего вида: chmod код имя_файла Поле код состоит из трех частей. Левая часть указыва¬ ет, кому устанавливаются права (u - владельцу, g - груп¬ пе, о - остальным пользователям, a - всем пользовате¬ лям), центральная часть устанавливает, что делается с правом (+ - добавить, - - отменить, = - назначить право доступа) и правая часть устанавливает, какие права изменяются у пользователя (r - читать, w - изменять, x - выполнять). Отметим, что изменить полномочия по доступу к файлу имеет право только владелец или администратор системы. Пример 3.9. -ГОТОВО-> chmod go-rw sotrudnik -ГОТОВО-> После выполнения данного примера все пользователи ^ - группа и о - все остальные), кроме владельца файла, будут лишены (символ -) прав читать и изменять файл sotrudnik. Для того чтобы убедиться, что полномочия на доступ к файлу sotrudnik изменились, достаточно выпол¬ нить команду ls -/. 48
Пример 3.10. -ГОТОВО-> ls -1 sotrudnik -rw a513 19007 Jan 31 20x27 sotrudnik -готово-> В команде chmod можно одновременно указывать несколько ’’кодов", разделяя их запятыми без пробелов. Пример 3.11. -ГОТОВО-> chmod q+w,o+rx bbb -ГОТОВО-> В данном примере предусматривается группе пользова¬ телей, в которую входит владелец, добавить право на изменение файла с именем bbb, а остальным пользователям- права на чтение и выполнение файла. Для изменения полномочий пользователей по доступу к файлам в системе имеется команда chmod с альтернативным синтаксисом: chmod ddd имя__файла Каждая буква d обозначает цифру от 0 до 7, и эти цифры относятся соответственно к владельцу, группе и всем остальным пользователям. Каждая цифра составляется путем сложения чисел: 4 - разрешить читать; 2 - разрешить изменять; 1 - разрешить выполнять. Пример 3.12. -ГОТОВО-> chmod 760 sotrudnik -ГОТОВО-> В результате выполнения данного примера будут уста¬ новлены следующие права по доступу к файлу sotrudnik: владелец файла будет обладать полными правами (4+2+1), группа-правами на чтение и изменение (4+2), а остальным пользователям запрещается какой-либо доступ к файлу (0). 49
Глава 4. РАБОТА С ФАЙЛАМ И В этой главе мы познакомимся с рядом простых команд, которые могут оказать неоценимую yoivrv пользователям при работе с файлами. Но прежде чем перейти непосредст¬ венно к рассмотрению команд, сделаем нсоолынос замеча¬ ние. Практически со всеми командами (нрогрлммами) систе¬ мы MOC ЕС обмен данными ведется через стандартный ввод-вывод. В обычном режиме в качестве такого уст¬ ройства выступает терминал пользователя. Ьез мпного ука¬ зания откуда, (из какого файла) должны поступать исход¬ ные данные для выполнения команды и куда (н какой файл) направлять результат ее выполнения, исходные данные бу¬ дут вводиться пользователем с клавиатуры, а результат выполнения будет отображаться на экране терминала. Рассмотрим первую из этих команд ( которая ранее использовалась для просмотра на экране терминала содер¬ жимого некоторого файла), позволяющую объединять нес¬ колько файлов в один. Команда имеет следующий вид: cat имя^райла [имя^райла] ... > имя_<райла Символ > в команде объединения указывает на то, что объединяемые файлы должны быть отображены не на экране терминала, а записаны в файл, имя которого стоит правее символа >, т.е. происходит переадресация стандартного вывода. Отметим также, что в приводимых примерах, как пра¬ вило, будет предполагаться, что используются файлы те¬ кущего каталога. Правила именования файлов изложены в предыдущей главе. Пусть в файле filel хранится следующий текст. i i | Многие пользователи отдают предпочтение системе| | MOC ЕС, потому что она имеет великолепные средства\ j для равоты с текстом« | i : i а в файле file2: 50
1 В этом нет ничего удивительного, поскольку при создании программ на равоту с текстом программист тратит значительную часть времени. По аналогичным причинам MOC ЕС позволяет повы- сить эффективность труда секретарей, админист¬ ративных равотников и ученых. Эти два файла содержат две части одной статьи, кото¬ рые в целях сокращения времени на ее подготовку од¬ новременно готовили два пользователя системы MOC ЕС. Для их объединения в один файл, например с именем statya, достаточно ввести команду вида - готово -> cat filel file2>statya - готово -> Аналогичного эффекта (объединения файлов) можно до¬ биться выполнением следующей команды: cat file2>>filel Эта команда предписывает дописать содержимое файла file2 в конец (символы > >) существующего файла filel. Теперь пользователь может провести окончательное редактирование всей статьи, текст которой хранится в файле statya, прибегнув к услугам редактора текстов ned и форматера nroff. Для просмотра результирующего файла также можно вос¬ пользоваться командой cat. Пример 4.1. - готово -> cat statya Многие пользователи отдают предпочтение системе MOC ЕС, потому что она имеет великолепные средства для равоты с текстом. В этом нет ничего удивительного, поскольку при создании программ на равоту с текстом программист тратит значительную часть времени. По аналогичным причинам MOC ЕС позволяет повы- 51
сить Эффективность труда секретарши, лдминист- ративных равотников и ученых. - ГОТОВО -> После объединения нескольких файлом 1и один может отпасть необходимость в хранении одною или нескольких из них в системе. Для уничтожения ненужных файлов служит команда вида rm имя_файла__1 . . . имя__файла_п Особенностью этой команды янлистсм то, что она требует подтвердить уничтожение тою или иного файла. Это позволяет существенно снизить нсронтшк'ть ошибочного уничтожения нужного файла. Например, после <^>ьсдинения содержимого файлов filel и file2 в файле с именем statya необходимость в файлах filel и file2 может отпасть, и они могут быть уничтожены: - готово -> rm filel file2 гтгуничтожить filel7(y/n) У гтгуничтожить file27(y/n) У - ГОТОВО-> Команда rm позволяет освобождать намять ЭВМ от ненуж¬ ных пользователю файлов, а также очистить каталог, подлежащий уничтожению (см. гл. 3). Для уничтожения всех файлов текущего каталога удобно воспользоваться командой следующего вида: rm * Символ * (звездочка) указывает на то, что должны быть уничтожены все файлы текущего каталога. Однако и в этом случае команда rm затребует подтверждения каждого уничтожаемого файла из каталога. Чтобы избежать этого, достаточно задать опцию -/. Пример 4.2. -ГОТОВО-> rm -f * -ГОТОВО-> 52
[ Символ * (звездочка) относится к группе метасимволов (см. гл. 2), с помощью которых можно генерировать раз- \ личныепоследовательностисимволов. [ К метасимволам относятся следующие символы: * - любая последовательность любых символов; ? - любой единичный символ; /...у - любой единичный символ из заданной после¬ довательности. Пример 4.3. -ГОТОВО-> rm -f file? -ГОТОВО-> В данном примере будут уничтожены все файлы, имена которых состоят из пяти символов, первые четыре из которых file (например, filen, file4). Пример 4.4. | -ГОТОВО-> ' cat file* -ГОТОВО-> В данном примере на экране терминала отобразятся все файлы текущего каталога, имена которых начинаются с file, а далее имеют любые символы в любом количестве (например, file, filel, fileabcd, filel2345). Обратите внимание, что в данном примере в отличие от предыдущего будет отображен и файл с именем file. Если файл file просматривать не требуется, то пример примет вид: -готово-> cat file?* -ГОТОВО-> Рассмотрим еще один пример: -готово-> rm -f file[alc3] -ГОТОВО-> 53
В данном примере будут уничтожены файлы с именами Шеа, fflel, Шес и file3. Однако при использовании метасимволов в команде rm с -f нужно быть очень осторожным, чтобы случайно ни уничтожить совсем не те файлы. Лучше этого избегать. f Пример 4.5. -готово-> cat fiie.[4-7]>/mntsys/uwc/a513/RAZ4/filename -ГОТОВО-> В данном случае файлы текущего каталога file.l, file.2, file.3 и file.4 будут пересланы в файл /mntses/ uwc/a513/RAZ4/filename. Знак - (минус) в данном примере указывает на задание диапазона, в частности, от 4 до 7 (см. гл. 2). Обратите внимание также на использование точки в именах файлов, она выступает как обычный символ в отличие от редактора ned. Отменить специальное значение метасимвола можно путем установки перед ним экранирующего символа обратной косой черты ( \). Пример 4.6. -ГОТОВО-> rm -f file\\* -ГОТОВО-> В данном примере будет уничтожен файл с именем file*, а не все файлы, начинающиеся с символов Ые\. Отменя¬ ется специальное значение символа \ также с помощью обратной косой черты (\). Заметим, что во всех командах, где допускается использование имен файлов, эти имена могут задаваться с помощью метасимволов. Вернемся к команде cat, которая позволяет также создавать и заносить данные в файл. Для этого использу¬ ется команда cat следующего вида: cat > имя^райла В данном случае вся вводимая на клавиатуру терминала информация будет направляться в файл. Для добавления данных в ранее созданный файл вместо символа > необходимо записать > >. После завершения набора данных 54
необходимо нажать клавишу ВЫЗОВ ТЕСТА, чтобы указать команде cat о завершении ввода. Заметим, что пустой файл пользователь может создать по следующей команде: >имя_файла Пример 4.7. -ГОТОВО-> >filel2 -ГОТОВО-> В данном примере будет создан пустой файл с именем filel2. Напомним, что пользователь может просмотреть содер¬ жимое текущего каталога по команде ls. Пример 4.8. - ГОТОВО -> is filel file2 statya - ГОТОВО-> Команду cat можно использовать также для копирования и переименования файлов. Так, например, для переименова¬ ния файла необходимо скопировать его в другой файл с требуемым именем и уничтожить старый: - готово-> cat statya>thnl2 - ГОТОВО-> rm statya гтгуничтожить statya7(y/n) У - ГОТОВО -> Для копирования файлов можно также воспользоваться командой cp, имеющей вид: cp имя_копируемого_файла имя_нового__файла 55
Пример 4.9. - ГОТОВО -> cp /mntsys/uwc/b513/statya /mntsys/uwc/b513/TH/thnl2 - ГОТОВО -> <* В данном примере копируется файл statya, хранящийся в каталоге /mntsys/uwc/b513, в файл, который будет создан в каталоге /mntsys/uwc/b513/TH. Прежняя копия файла при копировании сохраняется. Если необходимо скопировать все файлы каталога, то можно воспользоваться метасимволами. Пример 4.10. -ГОТОВО-> cp * /mntsys/uwc/a505 -ГОТОВО-> В этом примере все файлы текущего каталога будут ско¬ пированы в каталог /mntsys/uwc/a505 с прежними именами. В системе есть и специальная команда копирования каталогов: cpt имя__копируемого__каталога имя^нового^каталога Команда cpt копирует полное поддерево файловой систе¬ мы, которое задано именем каталога в поле iuxujconupy- eM020jcarcui02a в другое поддерево, имя каталога которого указано в поле имя_нового_катаяога. Имена подкаталогов и файлов копируемого каталога сохраняются и в новом ката¬ логе. Копирование каталога в свой подкаталог ведет к непредсказуемым результатам. Пример 4.11. -ГОТОВО-> cpt KNIGA /mntsys/uwc/a505/KNIGA -ГОТОВО-> В данном примере копируется подкаталог KNIGA текущего каталога в каталог KNIGA файловой системы пользователя a505. Для перемещения и переименования файлов можно вос¬ пользоваться командой пересылки mv следующего вида: mv старое^имя^срайла новое_имя_срайла 56
Пример 4.12. - ГОТОВО -> mv statya thnl2 - ГОТОВО -> После выполнения данного примера файл statya будет переименован в thnl2. Если в поле Hoeoejujuajpaiuia ука¬ зано имя каталога, то файл будет перемещен под своим именем в этот каталог. Пример 4.13. -ГОТОВО-> pwd /mntsys/uwc/b513 -ГОТОВО-> mv statya /mntsys/uwc/b513/KNIGA -ГОТОВО-> После выполнения данного примера файл с именем statya будет перемещен из текущего каталога в каталог /mntsys/ uwc/b513/KNIGA. Аналогично команде cpt в системе есть команда mvdir, обеспечивающая перемещение (переименование) каталогов: mvdir старое__имя__каталога новое_имя_каталога Пример 4.14. -ГОТОВО-> mvdir /mntsys/uwc/b513/KNIOA /mntsys/uwc/a505/KNIGA -ГОТОВО-> В данном примере в отличие от команды cpt каталог KNIGA будет не скопирован, а перемещен из файловой системы пользователя b513 в файловую систему пользовате¬ ля a505. Отметим, что при копировании файлов и каталогов сохраняются прежние полномочия по их использованию. Иногда бывает полезным,чтобы файл имел несколько различных имен (псевдонимов). Например, при подготовке статьи для журнала бывает 4 удобно присвоить файлу два имени. Одно из них, например rabfile, будет указывать на то, что в файле содержится информация по работе с файлами, а второе - thnl2 - н^ то, что это материал в 57
12-й номер журнала Техника и наука. Команда присвоения псевдонимов некоторому файлу имеет вид: ln имя_файла псевдоним__1 . . . псевдоним^п Пример 4.15. ** - ГОТОВО -> ln rabfile thnl2 - готово -> С помощью команды ln можно подключить один и тот же файл к различным каталогам, т.е. команда ln обеспечи- вавает создание перекрестных ссылок. Пример 4.16. -ГОТОВО-> pwd /mntsys/uwc/b513/TH -ГОТОВО-> ln glava /mntsys/uwc/b513/MOC/qlava -ГОТОВО-> В результате выполнения данного примера пользователь имеет возможность обращаться к файлу просто по имени glava независимо от того, какой каталог из двух является текущим (/mntsys/uwc/b513/TH или /mntsys/uwc/b513/MOC). Следует особо отметить, что команда ln в отличие от команд cat и cp не создает новую копию файла и не пересылает файл на новое место, как это делает команда mv, а просто присваивает ему еще одно или несколько новых имен. В связи с этим любые изменения в файле thnl2 приведут к аналогичным изменениям в файле rabfile. Уничтожить псевдоним файла можно по команде rm, сам файл будет уничтожен только при уничтожении его последнего имени. В процессе работы может потребоваться не объединение файлов, а наоборот - разделить один файл на несколько файлов. Для этих целей можно воспользоваться командой taii -n имя__файла^1>имя__файла__2 которая предписывает прочитать из файла, имя которого указано в поле имя_файла_1у n последних строк и записать их в файл, имя которого задано в поле имя_файла_2. Для добавления n последних строк из файла1 в конец существу- 58
ющего файла2 достаточно вместо символа > записать символы > >. Например, для вывода на экран терминала семи последних строк выше сформированного файла statya достаточно выполнить следующую команду: -готово-> tail -7 statya В этом нет ничего удивительного,поскольку при создании программ на равоту с текстом программист тратит значительную часть времени. По аналогичным причинам MOC ЕС позволяет повы¬ сить эсрсрективность труда секретарей, админист¬ ративных равотников и ученых. -готово-> Если перенаправление стандартного вывода не прово¬ дится, то, ‘ естественно, результат выполнения команды tail будет отображен на экране терминала пользователя. Обратной по отношению к команде tail является команда head, - которая обеспечивает считывание в стандартный выходной файл первых n строк файла: head +n имя^райла Если команды head и tail позволяют делать горизон¬ тальные выборки из файла, то команда colrtn обеспечивает вертикальные выборки из файла: colrm nl [n2j имя__райла По команде colrm производится удаление колонок в фай¬ ле, начиная с позиции nl и заканчивая позицией n2. Если параметр n2 не задан, то удаляются все колонки, начиная с колонки с номером nl. Предположим, что в файле с име¬ нем сотрудник хранятся сведения о сотрудниках некоторой организации. При этом фамилии сотрудников занимают колонки с 1-й по 20-ю, должность - с 21-й по 35-ю и т.д. Для того чтобы получить список сотрудников и сохранить его в отдельном файле, достаточно выполнить пример. Пример 4.17. -ГОТОВО-> colrm 21 coTpyAHHK>spisok -ГОТОВО-> 59
Совместное использование команд tail> head и colrm позволяет вырезать из файла любые его участки. В качес¬ тве примера покажем, как выбрать из файла statya таблицу (см. гл. 2). Пример 4.18. ^ -ГОТОВО-> head + 136 statya>tabll -ГОТОВО-> tail -22 tabll>tabl -ГОТОВО-> colrm 52 tabl>tabll -ГОТОВО-> colrm 1 25 tabll>tabl -ГОТОВО-> rm -f tabll -ГОТОВО-> В результате выполнения данного примера в файл tabl будет помещена собственно таблица. Следует отметить, что в командной строке на экране терминала можно писать несколько команд, разделяя их при этом точкой с запятой (;). Пример 4.19. -ГОТОВО-> head +136 statya>tabll;tail -22 tabll>tabl; colrm 52 tabl>tabll)Colrm 1 25 tabll>tabl;rm -f tabll -ГОТОВО-> Раскроем маленький секрет. Команды head и colrm отсутствуют в комплекте поставки MOC ЕС, однако это не причина для огорчения. Пользователь может создать их сам, как это сделали авторы, и включить в систему. Как? Это будет показано в гл. 8. Иногда бывает необходимо, особенно при подготовке исходного текста программы, рукописи статьи или книги, подсчитать объем файла или совокупности файлов: сколько в нем (в них) строк, слов, символов. Для этого служит команда wc: wc имя__файла__1 . . . имя_срайла__N 60
Пример 4.20. - ГОТОВО -> wc statya 9 47 381 statya - ГОТОВО -> Таким образом, текст, хранящийся в файле с именем statya, содержит девять строк, 47 слов и 381 символ. Для сохранения результата выполнения команды wc (впрочем как и любой другой команды) достаточно переадресовать стан¬ дартный вывод в требуемый файл. Пример 4.21. -готово-> wc statya>rab -ГОТОВО-> Если у пользователя есть несколько копий одного и того документа или версий программы и он хочет узнать, чем они отличаются друг от друга, то удобно восполь¬ зоваться командой diff, имеющей вид: diff имя_файла__1 имя__ файла__2 Пример 4.22. - готово -> diff filel file2 l,4cl,6 < . . . < Многие пользователи отдают предпочтение сис- < теме MOC ЕС, потому что она имеет великолепные < средства для равоты с текстом. > В этом нет ничего удивительного, поскольку > при создании программ на равоту с текстом > программист тратит значительную часть времени. > По аналогичным причинам MOC ЕС позволяет повы- > сить эффективность труда секретарей, админист- > ративных равотников и ученых. ГОТОВО -> 61
Сообщение l,4cl,6 говорит о том, что строки с 1-й по 4-ю файла filel отличаются от строк с 1-й но (> ю файла file2. На экране терминала приводится содержимое отли¬ чающихся строк. Эта команда окажет неоценимую услугу программистам при анализе различных д^ерсий одной и той же программы. Если у пользователя накопилось достаточно много файлов, в которых содержится информация но различным аспектам, и он, ecrecfBeHHo, не в состоянии запомнить, где что хранится, или в организации есть "электронная” библиотека или хотя бы каталог, то для поиска файла с необходимыми данными следует воспользоваться командой grep, которая подскажет, в каких файлах хранится интере¬ сующая пользователя информация: grep 'шавлон' имя_файла_1 ... имя_райла_Ы Пример 4.23. - ГОТОВО -> grep 'электронный секретарь' thn* thnl : услугу окажет вам "электронный секретарь", tЬп11:"Электронный секретарь" также должен вез - ГОТОВО -> В данном примере были просмотрены все файлы (ме¬ тасимвол *), имена которых начинаются с символов thn, и только в двух из них, а именно thnl и thnll, содержатся сведения об ‘электронном секретаре'. Шаблон может также задаваться и с помощью мета¬ символов, используемых в редакторе ncd (см. гл. 2). Пример 4.24. -ГОТОВО-> grep '*3[0-9]' thnl -ГОТОВО-> В результате выполнения данного примера на экране терминала будут отображены все строки файла thnl, на¬ чинающиеся (метасимвол л) с цифр от 30 до 39 (3[0-9]). Напомним, что метасимвол л для устройств типа EC7920 кодируется парой символов \^. Если в команде grep указать флаг -л, то перед каждой строкой файла, соответствующей шаблону, будет выводиться и ее порядковый номер в файле. 62
Пример 4.25. -ГОТОВО-> grep -л 'электронный секретарь' thnll 510: grep 'электронный секретарьг thn* -ГОТОВО-> Для упорядочения содержимого файла в системе MOC ЕС служит команда sort. Каждая строка файЛа может состоять из одного или нескольких полей, обычно разделенных пробелами. Та часть строки, которую команда sort анали¬ зирует при упорядочении файла, называется ключом сорти¬ ровки. Ключами могут быть одно или несколько полей, части поля или вся строка целиком. Рассмотрим применение команды sort на примере упорядочивания списка активных пользователей системы MOC ЕС, получаемого по команде who (см. гл. 1) и сохраняемого в файле с именем spisok. Пример 4.26. - готово -> who>spisok;cat spisok e058 tty3cl Mar 17 13:58 e087 ttyOcO Mar 17 18:50 r031 ttyOc2 Mar 17 18:08 b513 ttyOc3 Mar 17 18:52 - ГОТОВО -> sort +0 spisok b513 ttyOc3 Mar 17 18:52 e058 tty3cl Mar 17 13:58 e087 ttyOcO Mar 17 18:50 r03l ttyOc2 Mar 17 18:08 - ГОТОВО -> sort +1 spisok e087 ttyOcO Mar 17 18:50 r031 ttyOc2 Mar 17 18:08 b513 ttyOc3 Mar 17 18:52 e058 tty3cl Mar 17 13:58 - ГОТОВО -> sort +4 spisok e058 tty3cl Mar 17 13:58 r031 ttyOc2 Mar 17 18:08 e087 ttyOcO Mar 17 l8-.50 b513 ttyOc3 Mar 17 18:52 - ГОТОВО -> 63
В данном примере выполнена сортировка списка активных пользователей, хранящихся в файле spisok (команда who>spisok), по идентификаторам пользователей, которые хранятся в первой колонке файла (опция +0), по номерам терминалов, которые хранятся во второй колонке (опция + 2), и по времени начала сеанса^пользователями, которые хранятся в последней (пятой) колонке файла (опция +4). С помощью команды sort можно выполнять и более сложные сортировки, задавая различные опции. Более полную инфор¬ мацию о команде sort, как и любых других командах системы MOC ЕС, пользователь может узнать по команде man. Для сохранения результата сортировки пользователю достаточно переадресовать стандартный вывод команды sort в требуемый файл (символы > или >>). Если пользователь хочет скрыть содержимое своих фай¬ лов от посторонних глаз, в том числе и от администратора системы, то он может зашифровать их с помощыо команды crypt следующего вида: crypt пароль < имя_файла__1 > имя_файла_2 , где поле uMajpai&ia_l указывает на файл, содержимое которого шифруется, а поле UMzjpaiuta_2 - на файл, в ко¬ тором будет храниться зашифрованный текст. Заметим, что после шифрования файл с открытым текстом необходимо уничтожить. Символ < в команде crypt (как и в любой другой команде) обеспечивает переадресацию стандартного ввода на некоторый файл, т.е. информация, которую необходимо обработать с помощью команды, теперь будет вводиться не с экрана терминала, а из файла, имя которого указано после символа <. Пусть в файле lettre хранится текст С Новъш годом/. Тогда после шифрования по паролю 1988 получим: -ГОТОВО-> crypt 1988<lettre>lettrel - ГОТОВО -> rm -f lettre - ГОТОВО -> cat lettrel #ШЗ??м??1??УсВз - ГОТОВО -> Расшифровка текста также производится по команде crypt. 64
Пример 4.27. - ГОТОВО -> crypt 1988<lettrel>lettre;cat lettre С Новым годом! - ГОТОВО -> Для шифрования содержимого файлов можно использовать также команду перекодировки следующего вида: tr строка1строка2 < имя_файла___1 > имя_срайла__2 которая предписывает заменить в информации из файла, имя которого задано в поле ымя_ файяа1у все символы, встречающиеся в строке, заданной в поле строка7, на соответствующие символы из строки, заданной в поле стро¬ ка!, Результат выполнения направить в файл, имя которого указано в поле имя_файла2. Командой tr в сочетании с командой sort можно вос¬ пользоваться для упорядочивания русского текста, напри¬ мер списка фамилий по алфавиту. Эта операция в силу особенностей программного обеспечения отечественных ЭВМ вызывает определенные трудности. Для проведения упоря¬ дочивания прежде всего необходимо подобрать любую возра¬ стающую последовательность кодов ASCII и поставить ее в соответствие русскому алфавиту. После этого произвести перекодировку по команде tr, выполнить сортировку по команде sort и провести обратную перекодировку с помощью все той же команды tr. Предположим, что в файле с именем fam ' хранится список фамилий, и его необходимо упорядочить: - ГОТОВО -> cat fam ОРЛОВ ВАРЕВ АНДРЕЕВ - ГОТОВО -> tr АБВГДЕЖЗИйКЛМНОПР !-l<fam>faml - готово -> sort faml>fam2 - ГОТОВО -> tr./-I АБВГДЕЖЗИйКЛННОПР<Гат2>Тат1 - ГОТОВО -> cat faml АНДРЕЕВ ВАРЕВ ОРЛОВ - ГОТОВО -> 3 Заказ № 1154 65
В данном примере для упорядочивания букв русского алфавита была выбрана последовательность кодов ASCII !,",#,S, ... , 1. В том случае, если последовательность возрастает согласно кодам ASCII, достаточно задать первый знак последовательности v^ через символ - (знак минус) последний знак последовательности, что и сделано в данном примере. В результате выполнения этого примера в файле faml получим упорядоченный по русскому алфавиту список фамилий. Файл fam2 за его ненадобностью должен быть уничтожен. В следующей главе будет показано, как упростить этот пример за счет использования такого мощного средства системы MOC ЕС, как конвейеры. В данной главе рассмотрен далеко не полный перечень команд по работе с файлами. Следует также отметить, что большинство из рассмотренных команд имеют флаги, которые значительно расширяют их возможности. Полную информацию по любой из команд, как уже отмечалось, пользователь может получить из справочной службы системы MOC ЕС по команде man. Глава 5. УПРАВЛЕНИЕ ПРОЦЕССАМИ В операционной системе MOC ЕС все команды представля¬ ют собой программы, имеющие стандартный ввод и стандарт¬ ный вывод. Аналогично пользователь может создавать и свои собственные программы, разрабатывая их на входящих в состав системы языках программирования, например, на языках Си, Фортран 77, Паскаль. Разработанные пользова¬ телем программы также могут иметь стандартные ввод и вывод, о чем будет сказано ниже. Все программы в системе MOC ЕС хранятея в файлах. Для выполнения программы поль¬ зователя достаточно ввести имя файла, в котором она хранится. Однако если каталог, в котором хранится прог¬ рамма пользователя, не является текущим, то требуется указывать полное имя файла. Этот недостаток можно устранить, но об этом будет рассказано в следующей главе. Если при запуске программы, имеющей стандартные ввод и вывод, предполагается организация ввода данных не с экрана терминала, а из ранее подготовленного файла, и результат выполнения программы также должен выводиться в некоторый файл, то достаточно указать переадресацию стандартного ввода-вывода на соответствующие файлы: имя_<райла__1 < имя_срайла__2 > имя_райла_3 66
где в поле uuiajpaiuiaJ задается имя файла, в котором хранится выполняемая программа, а в полях имя_файла 2 и имя_файла-3 указываются имена файлов, из которых будут вводиться и выводиться данные соответственно, например: sort<filel>file2 Если результат выполнения программы требуется допи¬ сать в конец существующего файла, то необходимо вместо символа > записать символы >>, например: sort<filel>>file2 Отметим особенность переадресации стандартного вывода для цепочки команд (см. гл. 4). Предположим, что необхо¬ димо выдать календари на ноябрь и декабрь 1989 г. и сохранить их в файле calendar: -ГОТОВО-> cal 11 1989>calendar;cal 12 1989>>calendar -ГОТОВО-> или -ГОТОВО-> (cal 11 1989;cal 12 1989)>calendar -ГОТОВО-> В обоих случаях будет получен один и тот же резуль¬ тат, однако запись второго варианта существенно проще. Таким образом, чтобы результаты выполнения программ, входящих в состав цепочки, были сгруппированы в одном файле, необходимо всю цепочку заключить в круглые скобки и переадресовать стандартный вывод на требуемый файл. По существу дела заключенную в круглые скобки группу команд можно рассматривать как одну команду со стандартным выводом. Следует помнить, что если стандартный вывод некоторой команды, входящей в состав цепочки, уже переадресован на некоторый файл, то он, естественно, не попадет в выходной файл, на который переадресован стандартный вывод самой цепочки. Пример 5.1. -готово-> (cal 11 1989;who>ceanc;cal 12 1989)>calendar -ГОТОВО-> 3* 67
Результат выполнения данного примера аналогичен пре¬ дыдущему. Результат выполнения команды who будет сохра¬ нен в файле ceanc, а не в файле calendar. Отметим одну особенность выполнения списка команд, заключаемого в круглые скобки. Для выполнения этого списка команд системой вызывается новый монитор shell, который и обеспечивает выполнение этого списка. Именно благодаря этому команды, входящие в список, можно выполнять в фоновом режиме, а их выполнение никак не влияет на состояние текущего монитора shell. Пример 5.2. -ГОТОВО-> pwd /mntsys/uwc/b513 -ГОТОВО-> (cd KNIGA;cat glava2) -ГОТОВО-> pwd /mntsys/uwc/b513 -ГОТОВО-> В данном примере просматривается содержимое файла glava2 в каталоге /mntsys/uwc/KNIGA, и (что самое существенное) после выполнения цепочки команд текущий каталог остался прежним. Если же убрать круглые скобки, то текущим станет каталог /mntsys/uwc/b513/KNIGA. Монитор shell предоставляет удобные средства управле¬ ния выполнением команд, входящих в состав цепочки. Уп¬ равление выполнением команд в цепочке состоит в том, что в зависимости от результата выполнения предыдущей кома¬ нды монитор shell принимает решение о запуске следующей команды. Если объединить две команды с помощью оператора && (логическое "И"), то вторая команда, стоящая справа от оператора &&, будет выполняться только в том случае, если будет успешно завершена первая команда. Пример 5.3. -ГОТОВО-> mv filel file2 && cat file2 -ГОТОВО-> 68
В данном примере, если команда mv завершится аварийно (например, в текущем каталоге отсутствует файл filel), то команда cat выполняться не будет. В противном случае на экране терминала будет распечатан файл file2. Если же объединить двЬ'команды с помощью оператора | | (логическое "ИЛИ”), то вторая команда будет выполняться только при аварийном завершении первой команды. Заметим, что символ | (вертикальная черта) в MOC ЕС для устройств типа EC7920 кодируется парой символов \! (обратная косая черта и восклицательный знак). Пример 5.4. -гогово-> cc prog.c|\ned prog.c -ГОТОВО-> В данном примере команда cc обеспечивает трансляцию программы на языке Си, хранящейся в файле prog.c. Если трансляция прошла успешно, то выполнение цепочки завер¬ шается. Если трансляция завершилась аварийно, то прои¬ зойдет вызов редактора ned для редактирования исходного текста программы. Если запускаемая программа требует много времени на свое выполнение, то естественным является ее запуск в фоновом режиме, чтобы пользователь мог выполнять в сис¬ теме другие операции, не дожидаясь окончания запущенной им программы. Для этого пользователю достаточно в конце командной строки на запуск программы включить символ & (амперсенд), например: sort<filel>file2 & Теперь пользователь, не дожидаясь окончания сорти¬ ровки файла filel, которая может длиться десятки минут, может и дальше работать с системой. Аналогичным образом в фоновом режиме может быть выполнена и цепочка команд. Пример 5.5. -ГОТОВО-> (cal 11 1989;cal 12 1989)>calendar & 3996 -ГОТОВО-> 69
Запуск программы на выполнение в фоновом режиме посредством задания параметра & обладает одним сущест¬ венным недостатком: при выходе пользователя из сеанса работы с системой ее выполнение аварийно завершается. Однако этого можно избежать, ^если воспользоваться командой back, имеющей следующий формат: back -п "цепочка_команд_монитора" Команда back обеспечивает запуск цепочки команд, заключенной в кавычки (") в фоновом режиме с последую¬ щим сообщением пользователю о ее завершении. При этом сообщение выдается либо на терминал, если пользователь не прекращал работы с системой, либо по электронной почте, если пользователь вышел из системы. Пример 5.6. -ГОТОВО-> back -n "sort<filel>file2'' -ГОТОВО-> logoff В данном примере пользователь запустил на выполнение в фоновом режиме сортировку файла filel и вышеД из сис¬ темы (команда logoff). При следующем входе в систему пользователь по электронной почте получит сообщение, в которое будут включены выполнявшаяся цепочка команд и статус ее завершения. При успешном завершении в файле file2 пользователь найдет ожидаемый результат сортировки. Запущенная на выполнение программа в системе MOC ЕС называется процессом. Каждому процессу система присва¬ ивает уникальный идентификационный номер (идентифика¬ тор), который представляет собой целое число. При запус¬ ке любой программы в фоновом режиме система сообщает пользователю идентификатор соответствующего процесса. Пример 5.7. - ГОТОВО -> sort<filel>file2 & 3998 - ГОТОВО -> Идентификатор процесса позволяет пользователю одноз¬ начно идентифицировать запускаемую им программу в мно- 70
жестве других аналогичных выполняемых программ (процес¬ сов). Так, пользователь может организовать в фоновом режиме одновременную сортировку нескольких файлов, ис¬ пользуя одну и ту же программу sort. Пример 5.8. - ГОТОВО -> sort<filel>file2 & 3998 - ГОТОВО -> sort<file3>file4 & 4051 - ГОТОВО -> В данном примере процесс с номером 3998 связан с сортировкой файла filel, а процесс 4051 - сортировкой файла file3. Просмотреть список выполняемых процессов пользователь может, выдав команду ps с флагом а. Пример 5.9. -ГОТОВО-> ps а TTY PID COMMAND - 45 /etc/update 55 /etc/vmbrod 57 /etc/cron tty0c0 260 -sh tty0c0 566 /bin/sh -с ps a? tty0c0 3998 sort filel tty0c0 4051 sort file3 tty0c0 567 ps a tty0c0 336 /bin/sh -ГОТОВО-> Если в списке активных процессов отсутствует иденти¬ фикатор того или иного ранее запущенного процесса, то это указывает на то, что данный процесс завершен. С помощью идентификатора процесса пользователь мо¬ жет управлять выполнением запущенной программы. Так, если пользователь желает, чтобы система сообщала ему о моменте завершения запущенной в фоновом режиме програм¬ мы, то ему достаточно выдать команду следующего вида: ended идентисрикатор_процесса 71
Например: ended 3998 После завершения процесса с номером 3998 на экране терминала пользователя в этом Тлучае появится сообщение вида Process 3998 has ended (Процесс 3998 завершен). Идентификатор процесса используется также и при принудительном завершении выполняемой программы, напри¬ мер, если она зациклилась, по следующей команде: ki 11 идентисрикатор__процесса Например: ki11 3998 Отметим, что если после запуска процесса с иденти¬ фикатором 3998 пользователем была выдана команда ended 3998, то после выполнения команды kill 3998 срабатывает команда ended, и на экране терминала появится сообщение о завершении процесса: Process 3998 has ended Для принудительного завершения программы (команды), выполняемой не в фоновом режиме, достаточно нажать клавишу ПД1. Следует иметь в виду, что запуск команд в фоновом режиме может существенно сказаться на работе пользовате¬ ля за экраном терминала. Когда команды запускаются на выполнение первый раз, всем им присваивается один и тот же приоритет, числовое значение которого равно 20, т.е. все процессы получают одинаковый квант времени централь¬ ного процессора, что часто приводит к замедлению работы системы. Чтобы избежать этого, в системе имеется команда nice, позволяющая запускать фоновые процессы с понижен¬ ным приоритетом. Командашсе имеет следующий формат: nice [-число] команда & где число указывает, на сколько необходимо увеличиуь числовое значение приоритета. Увеличение числового зна- 72
чения приоритета в системе MOC ЕС означает понижение приоритета процесса. Число может принимать значения от 1 до 19. По умолчанию числовое значение приоритета увели¬ чивается на 10. Пример5.10. -ГОТОВО-> nice -15 sort file>filel& 1864 -ГОТОВО-> В данном примере в фоновом режиме будет выполняться сортировка (процесс с идентификационным номером 1864) с числовым значением приоритета 35 (20 + 15). Назначить числовое значение приоритета процесса меньшее 20 может только привилегированный пользователь путем задания отрицательного числа. Пример 5.11. -готово-> nice —10 sort file>filel & -ГОТОВО-> Посмотреть числовое значение активных процессов мож¬ но, выполнив команду ps с флагами -asl. Пример 5.12. -ГОТОВО-> ps -asl TTY PID ...PRI ... COMMAND - . . . 45 . . . 40 . .. /etc/update - . . . 55 ... 28 . .. /etc/vmbrod - . . . 57 . .. 40 . .. /etc/cron ttyOcl ... 392 . . . 28 ... -sh tty0c0 ... 374 . . . 26 ... п ../КНИГА/главаб tty0c0 ... 409 . . . 30 ... /bin/sh -с ps -asl? tty0c0 . . . 410 . . . 50 ... ps -as 1 В данном примере процесс с номером 409 (колонка PID) имеет числовое значение приоритета, равное 26 (колонка PRI), а процесс 410 - приоритет 50. Система MOC ЕС позволяет программы, имеющие стандарт¬ ные ввод и вывод, объединять в конвейеры, когда стан¬ дартный вывод одной программы переадресуется на стан- 73
дартный ввод другой программы. Для указания того, что две программы объединяются в конвейер, служат символ | (обратная косая черта \ и восклицательный знак ! при наборе с клавиатуры EC7920). Пример 5.13. - ГОТОВО -> who\sort +1 d009 ttyOcO Маг 19 12x09 d034 ttyOcl Mar 19 11x22 e087 ttyOc3 Mar 19 09x00 root tty3c0 Mar 19 11x37 b513 tty3c2 маг 19 13x20 - ГОТОВО -> В данном примере список активных абонентов системы, получаемый на выходе программы (команды) who, поступает на вход программы sort для упорядочивания по номерам терминалов (вторая колонка списка), за которыми работают пользователи. Результат выдается на экран терминала. Отметим также, что если программе, стоящей первой в конвейере, требуется ввод данных со стандартного ввода, то он может быть осуществлен либо с экрана терминала, либо переадресован на некоторый файл. Результат выпол¬ нения последней в конвейере программы, имеющей стандарт¬ ный вывод, может быть отображен как на экране, так и переадресован в файл. В качестве примера использования конвейера приведем пример упорядочивания списка фамилий по русскому алфавиту. Пример 5.14. -ГОТОВО-> cat fam ОРЛОВ ВАРЕВ АНДРЕЕВ -ГОТОВО-> tr АБВГДЕЖЗИйКЛМНОПР l-l<fam\sort\tr !-1 АБВГДЕЖЗИЙКЛМН0ПР>Гат1 -ГОТОВО-> cat faml АНДРЕЕВ ВАРЕВ ОРЛОВ -ГОТОВО-> 74
Данный пример проще рассмотренного аналогичного при¬ мера в предыдущей главе, не требуется никаких промежу¬ точных файлов. Однако и этот пример может быть еще более упрощен. В системе MOC ЕС имеется команда tee, которая, будучи включенной в конвейер, позволяет дублировать стандартный вывод программы, за которой она следует. Команду tee удобно применять, например, для сохранения в некотором файле промежуточных данных, получаемых в ходе выполнения конвейера, или для контроля на экране терминала данных, выводимых в файл. Пример 5.15. -готово-> cat fam ОРЛОВ ВАРЕВ АНДРЕЕВ -ГОТОВО-> tr АБВГДЕЖЗИЙКЛМНОПР !-Kfam\sort\ tr 1-1 АБВГДЕЖЗИйКЛМНОПР\гее faml АНДЕЕВ ВАРЕВ ОРЛОВ -ГОТОВО-> В данном примере по сравнению с предыдущим отпала необходимость в выполнении команды cat. Ее функции взяла на себя включенная в состав конвейера команда tee, которая не только записала результат в файл с именем faml, но и вывела результат на экран терминала пользователя. В том случае если есть необходимость сохранения промежуточных результатов, например, выполнения команды sort в файле с именем fam2, то пример примет вид: Пример 5.16. -готово-> cat fam ОРЛОВ ВАРЕВ АНДРЕЕВ -ГОТОВО-> 75
tr АБВГДЕЖЗИйКЛМНОПР !-l<fam\sort\ tee fam2]tr !-1 АБВГДЕЖЗИйКЛМН0ПР\Ьее faml АНДРЕЕВ ВАРЕВ ОРЛОВ -ГОТОВО-> ** Заметим, что любой конвейер для системы MOC ЕС - это программа, и на него, естественно, распространяется все то, о чем говорилось выше (например, конвейер можно вы¬ полнять в фоновом режиме). Как уже отмечалось, чтобы пользователь мог исполь¬ зовать для .работы с созданными им программами средства переадресации ввода-вывода, конвейеры, дублирование вы¬ вода и т.д., программы пользователя должны иметь стандартные ввод и вывод. В связи с этим в системе MOC ЕС принято соглашение, что в программах на языке Си стандартный ввод реализуется через файл с дескриптором 0, а стандартный вывод - через файл с дескриптором 1. В программах, разработанных на языке Фортран 77, стан¬ дартный ввод реализуется через канал с номером 5, а стандартный вывод - через канал с номером 6. В програм¬ мах, разрабатываемых на языке Паскаль, стандартный ввод реализуется через файл с именем input, а стандартный вывод - через файл с именем output. При объединении программ в конвейер пользователь должен помнить, что структура данных стандартного выхода программы, которая объединяется в конвейер с другой программой, должна соответствовать структуре данных в стандартном входе этой программы. Если этого соответ¬ ствия нет, то пользователь должен позаботиться о разра¬ ботке программы-фильтра, имеющей стандартные ввод и вывод и в функции которой будет входить установление этого соответствия, и включении ее в соответствующее место конвейера. На рис. 5.1 схематически показан пример использования программы-фильтра в конвейере. Программа! a,b,c > Фильтр c,a,b > Программа2 Рис. 5.1. Пример конвейера с фильтром 76
В данном примере предполагается, что в стандартный выход программы1 поступают данные в порядке a,b,c, программа2 в стандартном входе ожидает те же данные, только в другой последовательности, а именно: с, а, b. Программа-фильтр и устанавливает это соответствие. Разработка программы в простейшем случае включает: подготовку исходного текста; компиляцию исходного текста; исправление ошибок при их обнаружении и повторную компиляцию; выполнение программы. Подготовку исходного текста удобно вести с помощью экранного редактора текстов ned, рассмотренного в гл. 2 Напомним, что имена файлов, содержащие исходные тексты программ на языках Си, Фортран 77 и Паскаль, должны оканчиваться соответственно на символы .c , .f и .p. При этом пользователю достаточно вводить только ключевые слова операторов соответствующего языка (например, rnain, if, while, procedure и т.п.), после йего редактор отоб¬ ражает полную структуру оператора на экране терминала. Пользователю остается только заполнить недостающие поля оператора. Компиляция программ пользователя в простейшем случае выполняется по командам вида имя_компилятора имя_срайла_1 . . . имя_файла_п Для компиляции программ, написанных на языке Си, используется компилятор с именем cc, например: cc filtr.c Для компиляции программ на языке Фортран 77 исполь¬ зуется команда p7, например: f77 proc.f Компиляция программ, написанных на языке Паскаль, проводится командой pc, например: pc prog.p 77
Разрабатываемая пользователем программа может состо¬ ять из нескольких модулей, которые хранятся в отдельных файлах. В этом случае при компиляции программы необходи¬ мо указывать все файлы, в которых хранится программа. Пример 5.17. -ГОТОВО-> cc procl.c proc2.c proc3.c -готово-> В случае обнаружения после компиляции ошибок их необ¬ ходимо исправить с помощью редактора текстов и провести повторную компиляцию. Для отладки программ можно использовать также комп¬ лексные команды компиляции mcc, rr%p7 и mpc, которые в случае обнаружения ошибок в исходных текстах программ обеспечивают автоматический выход в редактор текстов для исправления ошибок. При успешном завершении компиляции получается выпол¬ нимая программа, которая автоматически записывается в файл с именем a.out. Для ее выполнения достаточно ввести имя файла a.out. Пример 5.18. - готово -> a.out - готово -> Если в программе пользователя используется стандарт¬ ный ввод и вывод и предполагается организовать ввод исходных данных из файла, а результат также направить в некоторый файл, то достаточно провести переадресацию ввода и вывода: a.out<filel>file2 Если пользователь предполагает полученную выполнимую программу использовать достаточно часто, то в целях экономии времени на повторную компиляцию ее необходимо 78
сохранить в другом файле, например воспользовавшись командой переименования файлов mv (см. гл. 5): mv a.out filtr Теперь для выполнения программы необходимо будет набирать имnfiltr, например: - готово - > filtr<filel>file2 - ГОТОВО -> Необходимость в переименовании скомпилированной прог¬ раммы возникает тогда, когда пользователь компилирует несколько программ. В этом случае после каждой успешной компиляции необходимо сохранять полученную программу в файле, отличном от файла a.out. В противном случае полученная в файле a.out программа будет уничтожена при следующей компиляции.
Раздел 2 ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ SHELL Глава 6. КОМАНДНЫЕ ФАЙЛЫ Читатель уже убедился, что MOC ЕС обладает множеством полезных команд, а используя различные их комбинации, можно реализовать новые функции, которых нет в явном виде в системе (например, вырезание различных участков файлов, упорядочивание в русском алфавите и тд.). Вместе с тем набор всей совокупности команд MOC ЕС последовательно или в виде цепочки команд и (или) конвейеров для реализации той или иной новой функции яв¬ ляется делом утомительным, особенно если эта совокуп¬ ность используется довольно часто. Система MOC ЕС поз¬ воляет хранить такие последовательности команд в так называемых командных файлах. Сами командные файлы часто называют sheU-процедурами, так как командный файл, по существу, содержит программу, написанную из команд монитора shell. Командный файл - это обыкновенный текстовый файл, содержащий совокупность команд монитора sheU. Создавать командные файлы удобно с помощью экранного редактора текстов ned. Для выполнения командного файла использу¬ ется монитор shell, который можно вызывать, как и любую другую команду MOC ЕС, имеющую стандартный ввод и вывод. Таким образом, для выполнения командного файла доста¬ точно выполнить командувида зЬ<имя_командного_райла или просто sh имя командного^срайла 80
Естественно, что результат выполнения командного фай¬ ла может быть переадресован в некоторый файл: sh имя_командного_файла>имя_срайла Заметим, что переадресация стандартного ввода для командного файла, так же как и для цепочки команд, заключенной в круглые скобки, распространяется только на первую команду в файле, требующую стандартного ввода. Отметим также, что управление выполнением команды sh аналогично управлению выполнением любой другой команды (см. гл. 6). В качестве примера рассмотрим командный файл rst, в который с помощью редактора ned запишем команды упоря¬ дочивания списка фамилий по русскому алфавиту (см.гл.5): Пример 6.1. -ГОТОВО-> cat rst tr АБВГДЕЖЗИЙКЛМНОПР !-l\sort\tr 1-1 АБВГДЕЖЗИ\ ЙКЛМНОПР -ГОТОВО-> sh rst<fam>faml -ГОТОВО-> cat fam faml ОРЛОВ ВАРЕВ АНДРЕЕВ АНДРЕЕВ ВАРЕВ ОРЛОВ -ГОТОВО-> В данном примере упорядочивался список фамилий из файла fam, а результат сортировки сохранен в файле faml. Обратите внимание на третью строку примера (tr АБВ ... ЖЗИ\), которая заканчивается обратной косой чертой (\). В данном случае при подготовке командного файла rst с помощью редактора ned команда tr не уместилась в одной строке. Для переноса ее на следующую строку необходимо отменить признак конца строки, который формируется ав¬ томатически. Для этого достаточно поставить в конце строки символ обратной косой черты (\У 81
По сути, была создана новая команда под именем rst. Вместе с тем команда rst не является полноправной командой, так как является все-таки параметром команды sh. Для того чтобы командный файл мог быть используемым как обычная команда монитора shell, ему необходимо присвоить статус выполнимого. Это делается с помощью команды chmod (см. гл. 4). Пример 6.2. -ГОТОВО-> chmod 755 rst -ГОТОВО-> rst<fam>faml -ГОТОВО-> Как видно из примера, теперь для выполнения команды rst достаточно указывать только ее имя. Следует отме¬ тить, что программа rst - достаточно простая команда, требующая только двух параметров. На практике приходится создавать командные файлы, обрабатывающие более двух параметров, когда использование стандартного ввода и вывода для передачи параметров оказывается недостаточ¬ ным. В качестве примера можно привести создание команд¬ ного файла для "вырезки" любого участка текста (см. гл. 5) из файла, когда в качестве параметров должны выступать имена входного и выходного файлов, номера строк и колонок вырезаемого участка. Таким образом, этот командный файл должен обрабатывать 6 параметров. Можно, конечно, создать командный файл и перед каждым его выполнением с помощью редактора ned проводить его редактирование, меняя в нем соответствующие имена и цифры. Однако такой подход вряд ли кого устроит. В системе MOC ЕС существуют различные механизмы передачи параметров в тело командного файла, которые подробно будут рассмотрены в гл. 8. Здесь мы коротко остановимся на использовании механизма позиционных параметров. При использовании механизма позиционных параметров обращение к командному файлу имеет вид: sh имя_командного__срайла параметр__1 . .. параметр__Ы или, если командному файлу присвоен статус выполнимого, имя^командного^райла параметр__1 .. . параметр_A/ 82
Параметры друг от друга и от имени командного файла должны отделяться пробелом. Монитор shell идентифицирует элементы командной строки с помощью номеров от 0 до 9. Первый элемент (имя командного файла) всегда обознача¬ ется как 0, следующий элемент (параметр 1) - как 1 и т.д. до $9. Пусть имеется командная строка следующего вида: okno +181 -13 4 41 glawa2 Тогда имя командного файла okno будет обозначаться как $0, значение первого параметра (+181) - как $1, значение второго параметра (-13) - как $2 и т.д. вплоть до пятого параметра, значение которого (glawa2) будет обозначаться как $5. Более подробно работа с позиционны¬ ми параметрами будет рассмотрена в гл. 7. В качестве примера приведем командный файл okno, обеспечивающий ’’вырезку" участка файла. Пример 6.3. -ГОТОВО-> cat okno head $1 $5]tail $2\colrn $4 | colrn 1 $3 -ГОТОВО-> who>file;cat file e035 tty3c2 Feb 7 17:57 a513 tty3c0 Feb 7 18:33 r031 ttyOcO Feb 7 19:17 e035 ttyOcl Feb 7 19:01 -ГОТОВО- -> okno +3 -1 9 21 fi le tty3c0 Feb ttyOcO Feb -ГОТОВО-> После подстановки позиционных параметров командный файл okno примет следующий вид: head +3 file{tall -l{colrm 21{colrm 19 Физический смысл параметров 7, 2, 3, 4 и 5 для командного файла okno показан на рис. 6.1. Обратите внимание на использование в командном файле 83
okno команд head и colnn, которые сами являются команд¬ ными файлами, подготовленными пользователями (см. гл. 5). Использование командных файлов head и colrm в команде okno аналогично использованию подпрограмм в языках высокого уровня. В системе также допускается и рекурсивное использование командных файлов, что будет рассмотрено в гл. 9. Файл file- $5 1 (+3) Выреза¬ емый участок файла $2 f-1) $3— (9) —$4— (21) Рис. 6.1 "Вырезка" участка текста из файла Иногда объемы командного файла могут достигать боль¬ ших размеров, а их выполнение идти достаточно долго. В этом случае у пользователя может возникнуть естественное желание, чтобы командный файл сообщал о ходе своего выполнения. Для этого достаточно включить в требуемое место командного файла команду echo, имеющую формат echo "текст соовщения" Команда echo (эхо) делает простую, но очень полезную функцию - направляет текст сообщения в стандартный вы¬ вод. 84
Пример 6.4. -готово-> cat rst echo "сортировка файла начата" tr АБВГДЕЖЗИЙКЛМНОПР !-l\sort\tr \ !-1 АБВГДЕЖЗИЙКЛМНОПР echo "сортировка файла закончена" -ГОТОВО-> rst<fam>faml сортировка файла начата сортировка файла закончена -ГОТОВО-> Использование команды ссЛо очень полезно при выполне¬ нии командных файлов в фоновом режиме. Остановимся на средствах отладки командных файлов (shell-процедур). К таким средствам относятся средства трассировки shell-процедур, позволяющие просматривать команды и переменные (о которых речь пойдет в следующей главе) по мере их выполнения, а также отображение строк shell-процедуры по мере их считывания на экране терминала. Для отладки shell-процедур необходимо вос¬ пользоваться командой sh следующего вида: sh флаг командный__файл Флаг может принимать одно из следующих значений: -x - осуществить трассировку shell-процедуры; -v - контролировать входные строки; -xv - провести трассировку shell-процедуры и контроль входных строк. Пример 6.5. -готово-> cat fam ОРЛОВ ПЕТРОВ АВЕРИН БЛАЖНОВ -ГОТОВО-> sh -xv rst<fam echo "сортировка файла начата" + echo сортировка файла начата сортировка файла начата 85
tr АБВГДЕЖЗИЙКЛМНОПР 1-l\sort\tr \ 1-1 АБВГДЕЖЗИЙКЛМНОПР + tr АБВГДЕЖЗИЙКЛМНОПР 1-1 + tr /-/ АБВГДЕЖЗИЙКЛМНОПР + sort АВЕРИН БЛАЖНОВ ОРЛОВ ПЕТРОВ echo "сортировка файла закончена" + echo сортировка файла закончена сортировка файла закончена -ГОТОВО-> Со смещением на экране терминала отображается строка из входного потока (командного файла), знаком + отмеча¬ ется выполняемая команда, за которой может следовать результат ее выполнения, если он должен быть направлен в стандартный вывод, либо идет присвоение значения пере¬ менной. Выше уже говорилось о возможности переадресации стандартного ввода и вывода, которые представляют собой файлы с дескрипторами 0 и 1. Помимо файлов, поддерживаю¬ щих стандартный ввод и вывод, команды монитора sheU используют еще один файл, имеющий дескриптор 2, в который система выводит сообщения об ошибках, а также некоторую другую служебную информацию. Так, команда sh при заданных флагах -xv в файл с дескриптором 2 выводит все отладочные сообщения. По умолчанию содержимое этого файла, так же как и стандартного ввода и вывода, выводится на экран терминала. Монитор shell предоставляет возможность переадресации файлов, имеющих различные дескрипторы, на любой другой файл, который может указываться как его именем, так и номером дескриптора. Переадресация вывода команды выполняется следующим образом: дескриптор^выходного^файла > имя__файла или дескриптор_выходного_файла > &дескриптор^файла Если переадресуется стандартный вывод, то дескриптор выходного файла (1) можно не указывать. Так, команды catfile l>filel и catfile>filel эквивалентны. 86
Переадресация ввода выполняется следующим образом: дескриптор_входного_файла < имя_файла или дескриптор__входног_файла < &дескриптор__файла Если переадресация идет на стандартный ввод, то дескриптор входного файла можно не указывать. Так, команда cat 0<fam эквивалентна команде cat <fam. Пример 6.6. -ГОТОВО-> sh -xv rst<fam 2>fileotl сортировка файла начата АВЕРИН БЛАЖНОВ ПЕТРОВ ОРЛОВ сортировка файла закончена -ГОТОВО-> cat fileot1 echo "сортировка файла начата" + echo сортировка файла начата tr АБВГДЕЖЗИЙКЛМНОПР !-l\sort\tr \ i-l АБВГДЕЖЗИЙКЛМНОПР + tr !-1 АБВГДЕЖЗИЙКЛМНОПР *f sort + tr АБВГДЕЖЗИЙКЛМНЛПР !-1 echo 9Щсортировка файла закончена" + echo сортировка файла закончена -ГОТОВО-> Данный пример по выполняемым функциям полностью идентичен предыдущему, за исключением того, что отла¬ дочные сообщения монитора shell сохранены в файле fileotl (2>fileotl). Результат выполнения процедуры rst естественно отобразится на экране терминала. Можно также обеспечить переадресацию вывода в различные файлы в один файл. 87
Пример 6.7. -ГОТОВО-> sh -xv rst<fam l>file 2>&1 -ГОТОВО-> В данном примере стандартный вывод процедуры rtf направляется в файл file {l>file), а файл с дескриптором 2 - на стандартный вывод (2>&1). Чтобы убедиться в том, что в файле file хранятся и результат выполнения процедуры rst, и отладочные сообщения монитора shell, выполните команду cat file. В процессе рабо’гы у пользователя может накопиться большой объем своих команд. В этом случае их удобно сгруппировать в отдельном каталоге. Однако этот каталог не всегда может быть текущим, и пользователю придется при выполнении команд из него указывать их полные имена (см. гл. 3). Этого можно избежать, включив имя каталога собственных команд в перечень каталогов, просматриваемых при поиске вводимых пользователем команд. Порядок поиска команды определяется системной пере¬ менной монитора shell PATH. В ней хранится список каталогов, в которых необходимо вести поиск команды. Значение переменной PATH устанавливается в профиле пользователя (см. гл. 2). Например, если переменная PATH имеет значение PATH=z/binz/usr/bin/etc то поиск команды сначала ведется в текущем каталоге (:) пользователя, затем в каталоге /bin и т.д. При присваивании переменной PATH имена каталогов, в которых будет вестись поиск команд, разделяются двоето¬ чием (:), а для указания текущего каталога служит пустое имя. Оно может быть задано двумя следующими подряд двоеточиями или одним двоеточием в начале строки. Если же значение переменной PATH равно следующему значению: PATH=/bin: /usr/bln: : /etc то поиск сначала ведется в каталоге /bin, затем в каталоге /usr/bin, далее в текущем каталоге и, наконец, в каталоге /etc. Переопределив значение переменной PATH в профиле пользователя, можно установить новый порядок просмотра 88
каталогов, а также включить в число просматриваемых каталогов свой собственный каталог команд, например: PATH=/mntsys/uwc/a513/bin:/bin:/etc:: Теперь поиск команд в каталогах будет вестись в следующем порядке: /mntsys/uwc/a513/bin /bin /etc текущий каталог пользователя При этом предполагается, что p каталоге /mntsys/uwc/ a513/bin хранятся собственные команды пользователя. При перечислении каталогов в переменной PATH рекомен¬ дуется придерживаться следующего правила: каталоги указываются слева направо в порядке убывания частоты использования содержащихся в них команд. Порядок внесе¬ ния изменений в профиль пользователя описан в гл. 1. За¬ метим, что профиль пользователя - это обычный командный файл, выполняемый при входе пользователя в систему. В том случае, если пользователь желает изменить порядок просмотра каталогов только на текущий сеанс, то достаточно просто присвоить переменной PATH новое значение. Пример 6.8. -готово-> PATH-/binz :/mntsys/uwc/a513/bin:/etc -ГОТОВО-> Подробно механизм работы с переменными будет рассмотрен в следующей главе. Глава 7. ПЕРЕМЕННЫЕ МОНИТОРА SHELL И РАБОТА С НИМИ На протяжении предыдущих глав были рассмотрены основ¬ ные команды монитора shell системы MOC ЕС, показано, как объединять их в конвейеры, создавать командные файлы и обеспечивать их выполнение с передачей им параметров. Все рассмотренные ранее команды и методы их использова- 89
ни я составляют элементы языка и стиль программирования на языке монитора shell (далее просто язык sheU). Поскольку речь идет о программировании, то естественно, что язык sheU располагает конструкциями, обеспечивающи¬ ми работу с переменными, обработку условных операторов, организацию циклов и т.д. Как и в любом языке программирования, в языке shell для хранения значений служат переменные (shdl-перемен- ные). SheU-переменные хранят символьные строки. Значе¬ ния sheU-переменным назначаются командой присваивания: HM9_she 11_/1еременной=символьная__строк а Имя sheU-переменной должно начинаться с буквы и может включать буквы, цифры и знак подчеркивания. В том случае если символьная строка содержит пробелы, знаки табуляции, символы новой строки и другие специальные символы (например, < или }), то она должна бщть заключена в кавычки или апострофы. Пример 7.1. -готово-> OS=tiHHKC^ -готово-> privet="СИСТЕМА MOC ЕС ПРИВЕТСТВУЕТ ВАС" -ГОТОВО-> В одной строке можно писать несколько операторов при- свайвания, разделяя их пробелами или точкой с запятой. Пример 7.2. -ГОТОВО-> OS-ЮНИКС privet='CHCTEMA MOC EC;ml2=1989 -ГОТОВО-> Доступ к значению переменной осуществляется под¬ становкой знака $ перед ее именем. С помощью команды echo легко проверить значения переменных. Пример 7.3. -ГОТОВО-> echo $os $privet $ml2 90
ЮНИКС СИСТЕМА MOC ЕС 1989 -ГОТОВО-> Следует отметить, что создаваемые переменные являются локальными, т.е. они доступны только в пределах текущего экземпляра монитора sheU. Если необходимо их сделать доступными (внешними) в любых порождаемых монитором процессах (например, при выполнении командного файла), то достаточно выполнить команду export следующего вида: export имя_переменной ... имя^переменной Пример 7.4. -ГОТОВО-> os=K)HHKC privet='CHCTEMA MOC EC';ml2=1989 -ГОТОВО-> sh -ГОТОВО-> echo $os $privet $ml2 -ГОТОВО-> kill -9 $$ -ГОТОВО-> export os privet ml2 -ГОТОВО-> sh -ГОТОВО-> echo $os $privet $ml2 ЮНИКС СИСТЕМА MOC ЕС 1989 -ГОТОВО-> kill -9 $$ -ГОТОВО-> В данном примере при уничтожении вновь созданного процесса по команде sh (был запущен еще один монитор sheU) использовалась системная переменная с именем $, в которую при запуске процесса автоматически заносится его идентификационный номер. Пользователь изменить значение этой переменной не может, используется только ее значение ($$). 91
Внешние переменные удобны при передаче параметров в командные файлы. Пример 7.5. -ГОТОВО-> vf=+181 nf=-23 lf=4 pf=41 -ГОТОВО-> export vf nf lf pf -ГОТОВО-> okno<glava2 n 1 7 С n II II \\Скорость l| Время \ l(kM/4) II ( ч ) | Ч И Ч 1| w . ' ^ Путь || 0176 (км) || 0177 II Л f 7 Q ll ir II I I | j ll и 1' tf | 0179 j 0180 I л 1 о 1 . . . -ГОТОВО-> cat okno head $vf]tail $nf\colrn lf | colrn 1 $pf -ГОТОВО-> Сравните этот пример с аналогичным в предыдущей главе. Если значение некоторой переменной не должно менять¬ ся, то целесообразно воспользоваться командой readonly, которая в последующем запретит изменение значения пере¬ менной. Команда имеет вид: readonly имя_переменной ... имя_переменной Список переменных, которые доступны только на чтение, можно получить, выполнив команду readonty без пара¬ метров. Пример 7.6. -ГОТОВО-> а—ПЕРЕМЕННАЯ b=1990 92
-готово-> readonly b -готово-> a=KOHCTAHTA b=1991 sh: is read only b -ГОТОВО-> echo $a $b КОНСТАНТА 1990 -ГОТОВО-> Язык shell допускает присвоение значения одной пере¬ менной другой, а также присвоение в качестве значения результата сцепления значений нескольких других пере¬ менных и (или) символьных строк. Пример 7.7. -готово-> a-M b=O C=c -готово-> moc=$a$b$c mocl-"$a"OC mocec-$a"OC ЕС" -ГОТОВО-> echo $a $b $c $moc $mocl $mocec M О С MOC MOC MOC ЕС -ГОТОВО-> В случае если сцепляются значения нескольких пере¬ менных, то они должны записываться безпробелов. Если же результат есть сцепление как значений переменных, так и символьных строк и последние следуют за переменной, то либо значение переменной, либо строка должна заключаться в кавычки. Используя команду echo с переадресацией стандартного вывода, значения переменных можно засылать в файл. Пример 7.8. -готово-> а=ЮНИКС b=HHMOC C="MOC ЕС" d=nEMOC e=KCEHHKC -готово-> echo $a $c >fileos;echo $b»fileos}echo $c $d>>fileos -TOTOBO->cat fileos ЮНИКС КСЕНИКС инмос MOC ЕС ДЕМОС -ГОТОВО-> 93
В языке sheU имеются системные shell-переменные, которые инициируются при входе пользователя в систему путем выполнения файла с профилем пользователя. С некоторыми из них мы уже встречались. Это, например, переменная PATH, в которой хранятся имена каталогов для поиска команд (см. предыдущую главу), переменная PS1, в которой хранится символика приглашения на ввод очередной команды. Значение систем¬ ных переменных пользователь может переопределять на время текущего сеанса. Пример 7.9. -ГОТОВО-*-> Р81="ВВОДИТЕ КОМАНДУ->" ВВОДИТЕ КОМАНДУ-> PATH=i/bini/etC ВВОДИТЕ КОМАНДУ-> В примере введена новая символика приглашения (ВВОАИ- TE КОМАНАУ-> ) и изменено значение переменной PATH, теперь поиск вводимых команд будет вестись в текущем каталоге и каталогах /bin и /etc. Рассмотрим еще одну системную переменную HOME. В этой переменной хранится имя файловой системы пользователя. Пример 7.10. -ГОТОВО-> echo $HOME /mntsys/uwc/b513 -ГОТОВО-> Как было показано в гл. 3, для перехода из текущего каталога в начальный каталог пользователя достаточно выполнить команду cd без параметров, что эквивалентно выполнению следующей команды: cd $HOME Аналогичным образом пользователь может сохранять в отдельных переменных полные имена файлов, чтобы затем их использовать в тех или иных командах. Пример 7.11. -ГОТОВО-> a=/mntsys/uwc/b513/file b=/mntsys/uwc/b513/RAZ 94
-готово-> cat $a>$b"/filel" -ГОТОВО-> В данном примере проводится копирование файла file из каталога /mntsys/uwc/b513 в файл filel каталога /mntsys/ uwc/b513/RAZ. Таким образом, переменные могут хранить имена файлов, каталогов и т.п. и могут использоваться в командах shell. Получить перечень текущих переменных и их значе¬ ния можно, выполнив команду set: Пример 7.12. -ГОТОВО-> set HOME=/mntsys/uwc/b513 IFS PATH=:/bin:/usr/bin:/etc PSl=-rOTOBO-> PS2 TERM=3277M2 а=ЮНИКС b=HHMOC -ГОТОВО-> Значения shell-переменным можно присваивать и с кла¬ виатуры терминала (в диалоге). Для этого служит команда вида read имя^переменной ... имя_переменной Пример 7.13. -ГОТОВО-> read а 4 -ГОТОВО-> echo $a 4 -ГОТОВО-> read а b с d 5 мМОС ЕС" МОСКВА "НИЦ ЭВТ" -ГОТОВО-> 95
echo $d $c $b $a НИЦ ЭВТ МОСКВА MOC ЕС 5 -ГОТОВО-> При наборе с клавиатуры значения должны разделяться пробелами. В этом случае если переменной присваивается символьная строка, содержащая пробелы, то она должна заключаться в кавычки. Оператор read позволяет писать диалоговые shell-программы. Рассмотрим еще один пример: -готово-> a=who b="who>file'' -ГОТОВО-> $a r019 tty3cl Feb 10 08:47 a513 tty3c2 Feb 10 09:43 f063 tty3c3 Feb 10 09:58 a501 tty3c4 Feb 10 09:12 -ГОТОВО-> $b sh:not found who>file -ГОТОВО-> В данном примере переменной а присвоена символьная строка who. После ввода в командной строке монитора символов $a монитор shell выбирает значение переменной а и интерпретирует его как имя команды (в данном случае who) и выполняет ее. При вводе же символов $b попытка монитора выполнить команду с именем who>file оказывается безуспешной, так как команды с таким именем не существует, хотя с точки зрения правописания вроде бы все написано верно: необходимо выполнить команду who и стандартный вывод ее переадресовать на файл с именем file. Чтобы обеспечить выполнение хранящихся в переменных команд, применяется команда eval, предписывающая напра¬ вить значение переменной на вход монитора не в качестве имени команды, а в качестве командной строки. Пример 7.14. -ГОТОВО-> b="who>file'' -ГОТОВО-> eval $b 96
-готово-> cat file r019 tty3cl a513 tty3c2 f063 tty3c3 a501 tty3c4 -ГОТОВО-> Feb 10 08:47 Feb 10 09:43 Feb 10 09:58 Feb 10 09:12 Монитор shell позволяет присваивать переменным не только символьные строки, но и результат выполнения любой команды, имеющей стандартный вывод, если заключить ее в знаки обратного ударения: shel1-переменная='командная^строка* Следует отметить, что в MOC ЕС знак обратного уда¬ рения для устройств типа EC7920 кодируются двумя симво¬ лами \< (обратная косая черта и знак меньше): shel1-переменная=\<командная_строка\< Пример 7.15. -готово-> 1s /mntsys/uwc/a513/KHHrA глава1 глава2 главаЗ литература введение -ГОТОВО-> ogl='ls /mntsys/uwc/a513/KHHrAi -TOTOBO->echo $ogl глава1 глава2 главаЗ литература введение -ГОТОВО-> Подстановка результатов оказывается весьма полезной в командных файлах (shell-процедурах), при выполнении которых меняется текущий каталог. Естественно, что при завершении таких процедур необходимо восстановить преж¬ нее значение текущего каталога: tekcd=*pwd' [запоминание текущего каталога] cd имя_тревуемого__каталога ... [тело shell-процедуры] cd $tekcd [восстановление исходного каталога] 97 4 Заказ № 1154
Подстановка результатов часто применяется при вы¬ полнении арифметических действий над shell-псрсменными. Для выполнения арифметических операций в языке shell используется команда expr следующего вида: expr параметр^1 операция параметр_2 В качестве параметров могут выаупать как значения переменных, так и константы, при этом параметры должны отделяться от операции пробелами. В shell-языке допусти¬ мы следующие арифметические операции: + - сложение; - - вычитание; * - умножение; /-деление; % - взятие остатка. Пример 7.16. -готово-> expr 13 + 6 19 -готово-> expr 17 - 2 / 5 3 -ГОТОВО-> Команда expr является одной из разновидностей калькулятора. Наибольший эффект в роли калькулятора команда expr дает тогда, когда сохраняются промежуточные результаты вычислений в переменных. Следует особо иметь в виду, что арифметические операции в команде expr выполняются строго слева направо (например, 17 - 2 / 5 = 3, а не 16.6). Подчеркнем также, что при выполнении операции умножения необходимо отменить специальный смысл метасимвола * (см. гл. 4). Для этого необходимо символ * заключить в апострофы, кавычки или установить перед ним обратную косую черту. Пример 7.17. -ГОТОВО-> а-2 -ГОТОВО-> a=*expr $a + 7' 98
-готово-> b='expr $a / 3' -ГОТОВО-> c='expr $a - i '*' $b' -ГОТОВО-> d='expr $c % 5' -ГОТОВО-> e-*expr $d - $b' -готово-> echo $a $b $c $d $e 9 3 24 4 1 -ГОТОВО-> Команда expr с помощыо операции сопоставления, обоз¬ начаемой двоеточием (:), позволяет также сравнивать символьные строки. Результатом выполнения команды срав¬ нения является число совпадающих символов в обеих стро¬ ках. Сравнение ведется путем наложения первого символа второй строки на первый символ первой строки, второго символа второй строки на второй символ первой строки и т.д. Поэтому даже один несовпадающий символ во второй строке приведет к неудачному сравнению и как следствие к нулевому результату. Пример 7.18. ^ -ГОТОВО-> expr 'аБвгде' : 'ass' 3 -ГОТОВО-> expr 'аввгде' : 'ввгде' 0 -ГОТОВО-> expr 'аБВ' : 'аБвгд1 0 -ГОТОВО-> Если сравнение прошло успешно, то результат указывает длину второй строки. Естественно, что в сравнении могут участвовать и значения переменных. Пример 7.19. -ГОТОВО-> a='аввгдежз' b='аввгд' -ГОТОВО-> 4* 99
c='expr $a : $b' -ГОТОВО-> echo £с 5 -ГОТОВО-> Если в переменной хранится символьная строка, содер¬ жащая пробелы, то такая переменная при использовании в команде сравнения должна заключаться в кавычки. Это свя¬ зано с тем, что при выборке значения из переменной мони¬ тор shell разделяет его (значение) на поля. По умолчанию признаком разделителей полей являются символы пробела, табуляции и новой строки. Перечень этих разделителей хранится в* системной переменной IFS. Естественно, что переменную IFS можно переопределить, однако делать это не рекомендуется. Пример 7.20. -TOTOBO->a="MOC ЕС” b='MOC' -ГОТОВО-> c=*expr "$a" : $b';echo $c 3 -ГОТОВО-> С помощью команды сравнения можно определить длину любой символьной строки, сформировав вторую строку в команде из метасимволов (см. гл. 2). Пример 7.21. -ГОТОВО-> а='Широка страна моя родная' -ГОТОВО-> b='expr ”$а" : '.*y;echo $b 24 -ГОТОВО-> Другой возможностью команды expr является ее способ¬ ность с помощью этикеток (см. гл. 2) выделять часть строки символов. Пример 7.22. -ГОТОВО-> a='Москва-город-герой 100
-готово-> b=*expr ”$a” : ' -ГОТОВО-> c='expr "$a" : '\(^*\) Л(-*\) -готово-> d=' expr "£а" : ' . . . -ГОТОВО-> echo $d $b $c город герой Москва -ГОТОВО-> ■\(’*\) В данном примере число пропускаемых символов ука¬ зывается явно с помощью метасимвола V (точка). Этого можно избежать, если использовать повторители (см. гл. 2). В качестве примера рассмотрим, как можно выделить несовпадающую часть двух строк: -готово-> а='НИЦЗВТ МРПГ b='НИЦЭВТ' -готово-> c=*expr "$a" : $b* -готово-> d='expr "$a" : '.\{’$с'\}‘ -ГОТОВО-> echo $d МРП -готово-> Существенным при этом является то, что переменная, используемая в повторителе, должна браться в апострофы. Язык shell предоставляет средства проверки: присвоено или нет значение переменной. При этом в зависимости от результатов проверки она может сохранить либо старое значение, либо получить новое. Эта процедура называется условной заменой переменной. Операция условной замены имеет вид: ${переменная операция новое_значение} Результат операции условной замены, естественно, может быть присвоен некоторой переменной: переменная=${переменная операция новое_значение} В поле Hoeoej3na4euue может использоваться значение переменной или символьная константа. Код условной замены 101
задается в поле операция с помощью символов -, = и +. Рассмотрим условную замену с кодом операции -: ${переменная-новое__значение} Порядок выполнения этой команды следующий. Если пере¬ менной, имя которой указано в поле переменная, уже было присвоено значение, то результатом выполнения этой ко¬ манды будет это значение и значение самой переменной не изменяется. Если же переменной не присваивалось значение или присвоено пустое значение (например, я = ""), то ре¬ зультатом выполнения команды будет символьная константа или значение переменной, указанной в поле новое_значе- ние. Проверяемая переменная остается пустой. Пример 7.23. -ГОТОВО-> a=4 c=5 d="" -ГОТОВО-> b=${a-$c} -ГОТОВО-> echo $a $b $c 4 4 5 -ГОТОВО-> e-${d-nPHBET} -готово-> echo $e $d ПРИВЕТ -ГОТОВО-> Обратите внимание на, то что код операции не должен обрамляться пробелами. Рассмотрим следующий вариант команды условной замены: ${переменная=новое^значение} В данной версии если переменная имеет значение, то результатом выполнения команды будет это значение, а значение переменной не изменяется. В противном случае результатом выполнения команды будет значение из поля 102
Hoeoej3HaneHue, которое также будет присвоено и пере¬ менной. Пример 7.24. -ГОТОВО-> a=''MOC ЕС" b=MOC d=MH -готово-> c=${a=$b} -ГОТОВО-> echo £с £Ь $a MOC ЕС MOC ЕС MOC -ГОТОВО-> e=${d=K)HHKC} -готово-> echo £е £d юникс юникс -готово-> Рассмотрим последнюю версию команды условной замены: ${переменная+новое_значение} Если переменной перед выполнением команды было прис¬ воено некоторое не пустое значение, то результатом ко¬ манды будет значение из поля новое_значеные, а значение переменной останется без изменения. Если же переменной не присваивалось значение, то она остается пустой, и ре¬ зультатом выполнения команды будет также пустая строка. Пример 7.25. -ГОТОВО-> a=4 b=6 d="" -ГОТОВО-> c=${a+$b} -ГОТОВО-> echo $c £а $b 6 4 6 -ГОТОВО-> e=${d+"MOC ЕС"} -ГОТОВО-> echo $e $d -ГОТОВО-> Ранее при рассмотрении командных файлов был описан 103
механизм передачи параметров посредством позиционных параметров (см. гл. 6). Этот механизм основан на использовании внутренних shell-переменных с именами 0, i, 2, ..., 9. К этим переменным применим весь аппарат, который был рассмотрен выше в этой главе, за исключением одного: значения этих переменных не могут быть изменены пользователем ни с помощью команды присвоения, ни с помощью условной здмены переменной (напомним, что имя shell-переменной, определяемой пользователем, всегда начинается с буквы). Для краткости переменные с именами 0, i, 2, ..., 9 в дальнейшем будем называть позиционнъши переменнъши. Значения позиционным переменным присваиваются при вызове команды или командного файла либо посредством команды set следующего формата: set символьная_строка_1 ... символьная_строка_М По команде set каждая символьная строка присваивается соответствующей позиционной переменной. Напомним, что символьная строка может задаваться как константой, так и переменной и, при наличии в ней пробелов, символов табу¬ ляции и новой строки и (или) других разделителей, ука¬ занных пользователем в системной IFS-переменной, должна заключаться в апострофы. В противном случае каждая под¬ строка символьной строки, обрамленная разделителями, будет присваиваться отдельной позиционной переменной. Доступ к значениям позиционных переменных аналогичен доступам кдругим переменным. Пример 7.26. -гогово-> set мир всем ”народам мира” -ГОТОВО-> echo $3 $2 $1 народам мира всем мир -ГОТОВО-> Если требуется изменить значение только отдельных позиционных переменных, в команде set все неизменяемые переменные должны быть заданы своими значениями. В противном случае произойдет полное переопределение пози¬ ционных переменных. 104
Пример 7.27. -ГОТОВО-> set мир всем народам мира -ГОТОВО-> echo $1 $2 $3 $4 мир всем народам мира -ГОТОВО-> set $1 детям $3 $4 -ГОТОВО-> echo $1 $2 $3 $4 мир детям народам мира -ГОТОВО-> Сравните этот пример с предыдущим. Для того чтобы поменять местами значения позиционных переменных, доста¬ точно их переопределить командой set, поменяв местами требуемые значения и указав все те позиционные перемен¬ ные, которые должны сохранить свое значение после пере¬ определения. Пример 7.28. -ГОТОВО-> set ЕС MOC МОСКВА -ГОТОВО-> echo $1 $2 $3 ЕС MOC МОСКВА -ГОТОВО-> set $2 $1 $3 -ГОТОВО-> echo $1 $2 $3 MOC ЕС МОСКВА -ГОТОВО-> Когда команда set применяется одновременно с под¬ становкой результата выполнения команды монитора shell, каждая из подстрок получаемой на выходе символьной строки, обрамленная разделителями, присваивается отдель¬ ной позиционной переменной. Пример 7.29. -ГОТОВО-> date Fri Feb 10 20:08:37 GMT+3:00 1989 105
-готово-> set *date* -ГОТОВО-> echo $5 $4 $3 $2 $1 1989 GMT+3:00 20:08:37 10 Feb Fri -ГОТОВО-> На практике число передаваемых в командный файл пере¬ менных может превысить число 9. Также может превысить число 9 количество подстрок при применении команды set одновременно с подстановкой. Этого не следует бояться., Монитор shell позволяет работать с неограниченным числом позиционных параметров. Пример 7.30. -ГОТОВО-> a='M Б В Г Д E Ж 3 И Й К Л M H О П P С T У Ф" -готово-> set $a -готово-> echo $1 $2 $3 $4 $5 $6 $7 $8 $9 А Б В Г Д E Ж 3 И -ГОТОВО-> echo $* А Б В Г Д E Ж 3 И Й К Л M H О П P С T У Ф -готово-> В данном примере переменной а присваиваются запи¬ санные через пробел первая 21 буква русского алфавита. По команде set $а эти буквы присваиваются позиционным переменным. Однако для пользователя доступны только первые девять позиционных параметров. Остальные пози¬ ционные переменные пользователь использовать не может. Однако он их может посмотреть, используя метасимвол * (см. команду echo $*). Если пользователь выполнит команду echo $12 в надежде посмотреть 12-ю позиционную переменную, то на экране терминала будет напечатано A2, т.е. значение позиционной переменной 1 ($1), и следу- 106
ющая за ним символьная строка, состоящая из одного символа 2. Обратим внимание еще на одну особенность данного примера. Если бы вместо команды set $a выпол¬ нялась команда set ''$a" , то значение переменной а было бы полностыо присвоено первой позиционной переменной, а все остальные имели бы пустое значение. Для доступа к значениям позиционных переменных,"име- на" которых больше 9, используется команда shift, кото¬ рая обеспечивает сдвиг значений позиционных переменных на одну позицию влево: $1 $2 $3 $4 $5 $6 $7 $8 $9 А Б В Г Д E Ж 3 И Й к shift $1 $2 $3 $4 $5 I $6 $7 $8 $9 А Б в Г Д E Ж 3 И й к L Пример 7.31. I -готово-> I set А Б В Г Д E Ж 3 И Й К Л M H О П P С T I -ГОТОВО-> | echo $1 $2 $3 $4 $5 $6 $7 $8 $9 I А Б В Г Д E Ж 3 И I -ГОТОВО-> f shift ? -ГОТОВО-> echo $1 $2 $3 $4 $5 $6 $7 $8 $9 Б В Г Д E Ж 3 И й -ГОТОВО-> shift I -ГОТОВО-> [ echo $1 $2 $3 $4 $5 $6 $7 $8 $9 \ В Г Д E Ж 3 И Й К ^ -ГОТОВО-> г i Рассмотрим зарезервированные shell-переменные, зна- ' чения которых устанавливаются монитором и которые поль- ; зователь может использовать в своих программах. Однако t 107
менять значения зарезервированных переменных пользова¬ тель не может. Монитор shell автоматически присваивает значения сле¬ дующим пяти переменным: ? - код завершения последней выполненной команды; $ - идентификационный номер текущего процесса (см. гл. 6); / - идентификационный номер последнего запущенного фонового процесса; # - число позиционных переменных, переданных команд¬ ному файлу или установленных покоманде^; - - текущие флаги монитора shell, установленные при его запуске йли измененные командой set. Для изменения флагов запущенного монитора shell слу¬ жит команда set следующего вида: set срлаги Пример 7.32. -готово-> set -v -готово-> После выполнения этого примера все входные строки, читаемые монитором, будут отображаться на экране терминала. Для отмены этого режима необходимо установить флаг +v. Использование зарезервированных shell-пеэеменных в shell-программах пользователя весьма полезно для повыше¬ ния надежности этих программ. Так, используя переменную #, можно проверить, все ли параметры переданы shell- программе (как это сделать, будет показано в следующей главе). Пример 7.33. -готово-> set 'date* -ГОТОВО-> echo $# 6 -ГОТОВО-> и $ , используя свойство уникальности 108 Переменные /
идентификационных номеров процессов, удобно использовать для создания временных файлов в рабочем каталоге системы (имя каталога /tmp). Пример 7.34. -гогово-> tempfile=/tmp/$$ -ГОТОВО-> cat file>$tempfile -ГОТОВО-> Более подробно использование этих переменных в shell- программах будет показано в следующей главе. Глава 8. УПРАВЛЯЮЩИЕ ОПЕРАТОРЫ SHELL-ЯЗЫКА Итак , мы рассмотрели, как оформлять программы на языке монитора shell в виде командных файлов (или, как их еще называют, shell-процедур), организовать их вы¬ полнение с передачей им параметров, работать с перемен¬ ными, строить конвейеры и т.д. Чтобы завершить рассмот¬ рение shell-языка как языка программирования высокого уровня, осталось рассмотреть его управляющие конструк¬ ции, такие, как циклы, условные операторы и оператор выбора и некоторые другие. Выше уже были рассмотрены простые условные операторы sheU-языка {&& и | |, см. гл. 6). Однако в языке shell есть и более сложные условные операторы, в первую очередь к ним относится условный оператор if имеющий следующую структуру: i f выражение then список_команд [ e1if выражение then список^команд ] [ else список__команд ]) fi Функции условного оператора if в языке sheU аналогичны функциям этого оператора во многих других языках программирования (сравните оператор if с анало¬ гичной конструкцией в языке Ада). Конструкции elif ... 109
then ... и else ... - не обязательны, причем число конструкций первого вида неограничено. Конструкция elif ... then ... позволяет более кратко записывать вложенные операторы if. В простейшем случае оператор if имеет следующий формат: if выражение then список^команд fi Оператор if в данном случае проверяет значение выражения, которое следует за именем оператора и, если оно истинно (равно 0), выполняет команды между ключевыми словами then и fi. Отметим одну особенность языка shell. Всем ключевым словам сложных операторов (например, оператору if или операторам цикла), кроме первого, при записи нескольких из них на одной строке по аналогии с цепочкой команд (см. гл. 5) должна предшествовать точка с запятой, например: if выражение*,ЬЬеп список_команд elif выражение;then список^команд else cnncoK_KOMaHA;fi Выражение в операторе if как правило, задается ко¬ мандой test> которая, в частности, обеспечивает срав¬ нение чисел, символьных строк, а также тестирование файлов и переменных. Для сравнения двух чисел команда test используется в следующем виде: test число_1 операция__отношения число_2 Операция отношения может принимать одно из следующих значений: -eq - числа равны ? -ne - числа не равны ? -ge - число-1 больше или равно числу-2 ? -le - число-1 меньше или равно числу-2 ? -gt - число~1 больше числа-2 ? -lt - число^ меньше числа-1 ? Числа могут задаваться константами или значениями пе¬ ременных. Для сравнения символьных строк используется команда test следующего вида: test строка_1 операция__отношения строка_2 110
Операция отношения для сравнения символьных строк может принимать одно из следующих значений: = - строки эквивалентны ? /= - строки не совпадают ? Строки также могут задаваться символьными константами и значениями переменных. Если переменная содержит символьную строку с символами-разделителями (например, содержит пробелы), то ее необходимо заключить в двойные кавычки. Заметим, что операцию отношения в команде test не¬ обходимо окружать пробелами. Для тестирования символьных строк и файлов использу¬ ется команда test следующего формата: test срлаг имя^райла или значение^переменной Флаг может принимать одно из следующих значений: -л - переменная содержит символьную строку ? -z - переменная содержит пустое значение ? -r - файл существует и его можно читать ? -w - файл существует и в него можно писать ? -x - файл существует и его можно выполнять ? -d - файл существует и является каталогом ? -s - файл не пустой ? Заметим, что может также применяться любая комбинация флагов тестирования файлов. Например, флаг -dw обеспе¬ чивает проверку на наличие файла, который должен яв¬ ляться каталогом и в который можно писать. Помимо этого при программировании на языке shell операции отношения и тестирования в команде test могут объединяться в более сложные логические выражения. В этих целях могут быть использованы операции логического отрицания (символ /), логического И (символы -d) и ИЛИ (символы -o)> выделяе¬ мые пробелами, а также круглые скобки (которые также должны окружаться пробелами), специальное значение ко¬ торых должно быть отменено с помощью обратной косой черты, например: test $a ! ~eq $b - значение переменной а не равно значению переменной b ? test \( $a -gt $b \)~о \( $a -eg $b \) - а больше b или а равно bl 111
test \( $a -lt 10 \) -а \( -r file \) - а меньше 10 и существует и можно читать из файла с именем Ые ? Отметим, что операция -а (логическое И) имеет более высокий приоритет, чем операция -о (логическое ИЛИ). Для демонстрации работы операторов if и test рас¬ смотрим пример sheU-процедуры, обеспечивающей выпол¬ нение программы пользователя, имеющей стандартный ввод и вывод, в заданное время суток. Отличительной особен¬ ностью этой процедуры является то, что пользователь, запустивший посредством ее свою программу на выполнение, может выйти из системы и даже выключить терминал. Пример 8.1. -ГОТОВО-> cat paket if test $# -ne 5 then echo "число параметров меньше 5" ex i t 1 elif test / -x $3 then echo "nporp. не имеет статуса выполнимой" exit 2 elif test ! -r $4 then echo "входной файл не доступен на чтение" ex i t 3 elif test \( $1 -gt 23 \) -о \( $2 -gt 59 \; then echo "неправильно задано время" ex i t 4 else back -n "tback $1 $2 $3 $4 $5" echo "программа принята на выполнение" fi -ГОТОВО-> Обращение к shell-процедуре paket при условии, что ей присвоен статус выполнимой (команда chmod 755 paket, см. гл. 3), имеет следующий вид: paket часы минуты имя__программы вх_файл вых^срайл В противном случае обращение имеет вид: sh paket часы минуты имя_программы вх^срайл вых__файл 112
В shell-процедуре paket появился новый оператор exit. В функции оператора exit входит завершение shell- процедуры и формирование кода возврата. В нашем примере в зависимости от допущенной пользователем ошибки код возврата принимает значения: 1, 2, 3 или 4. По умолчанию оператор exit сохраняет код возврата предыдущей команды. SheU-процедура paket проверяет правильность задания параметров, а именно: соответствует ли число параметров 5 (test $# -ne 5, напомним, что в системной переменной с именем # хранится число переданных процедуре позиционных параметров, см. гл. 7), если нет, то выполнение процедуры завершается с кодом возврата 1 (exit 1); существует и можно ли выполнить файл с программой, имя которого хранится в позиционной переменной с именем 3 (test ! -x $3), если нет, то выполнение процедуры завершается с кодом возврата 2 (exit 2); существует ли выходной файл и можно ли читать данные из него (test ! -r $4), если нет, то код возврата 3 (exit 3); правильно ли задано время запуска программы (test \ ( $1 -gt 23 \) -о \( $2 -gt 59 \^ ) в предположении, что час запуска не может превышать числа 23, а минуты - 59; в противном случае выполнение прекращается с кодом возврата 4 (exit 4). Проверка существования выходного файла не проводится, так как он может быть создан во время выполнения программы пользователя. Если проверка прошла успешно, то по команде back с флагом -n (см. гл. 5) запускается shell-процедура tback, в функции которой и входит запуск программы пользователя в указанное время. После этого выполнение процедуры paket завершается с сообщением пользователю, что его программа принята на выполнение (echo "програиша принята на вьиголнение"). Рассмотрим shell-процедуру tback: -готово-> cat tback tch=$l min=$2 prc=$3 vfl=$4 wfl=$5 while true 113
f i do set 'date' tektch='expr $4 : '\f.*\^ tekmin='expr $4 : '...\(.*\)...'‘ if test \( $tektch -eq $tch -a $tekmin -ge $min \) \ -o \( $tektch -gt $tch \; then eval "$prc<$vfl>$wfl" break fi sleep 900 done -ГОТОВО-> Обратите внимание на строку с оператором if, которая заканчивается обратной косой .чертой для указания на то, что оператор будет продолжен на следующей строке (см. гл. 6). В функции процедуры tback входит периодическая про¬ верка текущего времени с целью определения момента запуска программы пользователя. Для установления момента запуска программы необходимо организовать цикл, внутри которого будет сравниваться текущее время с требуемым. Для организации цикла в данном примере использован оператор while (пока), имеющий следующий формат: while выражение do список_команд done или по аналогии с оператором if: while BupaxeHne;do список_команд^опе Команда while проверяет код возврата выражения, ко¬ торое может состоять как из одной, так и из группы команд. Если код возврата равен нулю (true), то выполня¬ ются команды, заключенные между ключевыми словами do и done. Этот процесс продолжается до тех пор, пока команда while не зафиксирует ненулевое значение tfalse) кода возврата выражения. В языке shell есть две специальные команды true и false. Команда true всегда устанавливает код возврата, равный нулю, а команда false - единице. В нашем примере команда true использована в выражении оператора while, 114
что обеспечило организацию бесконечного цикла, внутри которого и определяется момент запуска программы поль¬ зователя. Для принудительного выхода из цикла может использоваться команда break, имеющая следующий вид: break [чис -о] Число определяет количество циклов при наличии вло¬ женных циклов, за пределы которых необходимо выйти. Если число не указано, то осуществляется выход за пределы текущего цикла (рис. 8.1.) Внешний цикл 1 wh11e . . . do г-< break 1 whi1e . . . do Цикл 2 Цикл 3 whi1e . do -< break 2 done done L-> . . . done L> Рис. 8.1. Использование оператора break В данном примере по команде break 2, выполняемой в самом внутреннем цикле 3, будет выполнен возврат за пределы текущего цикла 3 и цикла 2, в который он входит. По команде break 7, выполняемой во внешнем цикле 1, произойдет выход за предельь цикла 1. В данном случае достаточно было указать просто break. В языке shell есть и обратная по отношению к команде break команда continue, имеюшая следующий формат: continue [число] 115
Если команда break приводит к завершению циклов, то команда continue возвращает управление на начало цикла. Число определяет, к началу какого цикла необходимо вернуться, начиная от того, в котором она выполняется. Команда continue 1 или просто continue приводит к началу цикла, в котором она выполняется (рис. 8.2.) Заметим, что в процедуре tback вместо команды break можно использовать и команду exit, так как после выпол¬ нения команды break процедура завершает свое функ¬ ционирование. -> while . . do Внешний цикл 1 Цикл 2 -< continue done Рис. 8.2. Использование оператора continue Выполнение бесконечного цикла в процедуре tback может привести к тому, что центральный процессор основную часть времени будет занят только анализом текущего вре¬ мени и эффективность работы пользователей может резко упасть. В языке shqU есть специальная команда sleep, 116
которал приостанавливает выполнение программы на неко¬ торый промежуток времени. Команда sleep имеет следующий формат: sleep число где число задает время в секундах, на которое приос¬ танавливается выполнение процедуры. В нашем примере анализ текущего времени будет проводиться один раз в 15 минут (900 секунд). Помимо команды while> в языке shell для организации цикла применяется и оператор until (до) следующего формата: until выражение do список_команд done Действия оператора until аналогичны оператору while, за исключением того, что условием входа внутрь цикла яв¬ ляется ненулевой значение tfalse) кода выражения. Если в процедуре tback вместо оператора while использовать оператор until, то программа примет вид: until false do done В данном случае для организации бесконечного цикла по команде until в выражении использована команда false, у которой код возврата отличен от нуля (равен единице). В языке shell имеется еще один оператор организации циклов, а именно оператор for (для), который имеет следующий формат: for имя__переменной in список__значений do список^команд done Команда for организует выполнение списка команд, заключенного между ключевыми словами do и done, один раз для каждого значения из списка. При этом очередное выби- 117
раемое значение из списка присваивается переменной, имя которой указано слева от ключевого слова ш. Список значений может задаваться символьными константами и значением некоторой переменной, содержащей последо¬ вательность слов, разделяемых разделителями (например, пробелами). Пример 8.2. -готово-> cat vrgod for а in "времена года" зима весна лето осень do echo $a done -ГОТОВО-> sh vrgod времена года зима весна лето осень -ГОТОВО-> В данном примере приведена shell-процедура, распе¬ чатывающая времена года. Список значений в процедуре vrgod задается символьными константами. Пример 8.3. -ГОТОВО-> cat invers m=*echo $*';inv="" for а in $m do inv="$a $inv" done echo $inv -ГОТОВО-> sh invers 1 2 3 4 5 6 7 8 9 10 11 12 13 14 14 13 12 11 10 9 8 7 6 5 4 3 2 1 -ГОТОВО-> В данном примере приведена процедура, обеспечивающая обратное отображение входного списка значений. Список 118
значений в данном примере формируется в переменной с именем m из позиционных переменных (m = *echo $*^, причем число входных параметров процедуры invers неограничено (см. гл. 7). Обратите внимание на команду inv="$a inv", в которой правая часть взята в кавычки с целью отменить специальное значение пробела для включения его в выход¬ ную строку. Этим достигается присвоение переменной inv значения переменной а и через пробел - старого значения переменной inv. Данный пример может быть упрощен, если воспользовать¬ ся специальным форматом оператора/ог: for переменная do список^команд done Для оператора for данного формата в качестве списка значений выступают значения . позиционных переменных, устанавливаемые по команде set, или монитором sheU при вызове командных файлов. В качестве примера приведем shell-процедуру, которая определяет возможность корректировки файлов. Пример 8.4. -ГОТОВО-> cat wfl f or а do if test -w $а then echo "файл $а можно изменять” else echo **файл $а недоступен для изменения" fi done -ГОТОВО-> sh wfl fll /bin/who file glawa2 fl файл fll недоступен для изменения файл /Ып/who недоступен для изменения файл fileMOXHO изменять файл glava2 можно изменять файл fl недоступен для изменения -ГОТОВО-> Рассмотрим еще одну shell-процедуру, рекурсивно рас¬ печатывающую перечень подкаталогов текущего каталога. 119
Пример 8.5. -ГОТОВО-> cat podktl spwd='pwd* cd $1 tpwd=$l set *ls* echo "подкаталоги каталога *pwd'" for а do if test -d $a then echo $a ppdktl $tpwd/$a echo "конец подкаталогов" fi done cd $spwd -готово-> podktl /mntsys/uwc/b513 подкаталоги каталога /mntsys/ull51/a513 подкаталоги каталога /mntsys/ull51/a513/... конец подкаталогов КНИГА подкаталоги каталога /mntsys/ull51/a513/KHHrA конец подкаталогов ПРОГРАММЫ подкаталоги каталога /mntsys/ul151/а513/ПРОГРАММЫ конец подкаталогов -готово-> Особенностью этой shell-процедуры является то, что она является рекурсивной. Она вызывает саму себя, как только встретится каталог для поиска его подкаталогов. Так, в данном примере осуществляется поиск подкаталогов каталога /mntsys/uwc/b513. В результате поиска было установлено, что каталог содержит три подкаталога с именами ... (три точки), КНИГА и ПРОГРАММЫ, эти каталоги в свою очередь подкаталогов не содержат. Список значений позиционных параметров для оператора for в данном примере устанавливается по команде set (set 4s*). Отметим также, что каталог, в котором хранится процедура podktl, должен быть определен в переменной PATH (см. гл.7). В противном случае в теле процедуры необхо¬ димо указать полное имя файла podktl. 120
В состав shell-языка входит и оператор структурного программирования casey организующий ветвление по нес¬ кольким направлениям: case значение__метки in метка__1) список^команд;; метка_2 ) список_команд;; • • • MeTKa__N) список__команд;; esac Команда case сравнивает значение метки в заголовке с каждой из меток в ее теле и при их совпадении выполняет соответствующий список команд, после чего выполнение оператора case прекращается. Значение метки может задаваться как символьной константой, так и значением переменной. Сама метка задается символьной константой, которая может включать метасимволы. Каждому из списка команд может предшествовать несколько меток, разделяемых вертикальной чертой (|): case значение^метки in метка_1_1 | ... \MeTKa__l__N) список^команд;; метка_2__1 | . •. \метка__2_Ы) список_команд;; метка__М__1 | ... \метка__М__у) список_команд;; esac Напомним, что вертикальная черта в MOC ЕС для уст¬ ройств типа EC7920 кодируется парой символов: обратной косой (\) и восклицательным знаком (/). В качестве примера приведем shell-процедуру plan, обеспечивающую распечатку плана работы на требуемые дни недели. При этом предполагается, что пользователь гото¬ вит план работы на понедельник в файле с именем pon, на вторник - в файле vtor и т.д. Пример 8.6. -rOTOBO->cat sreda 8.30-10.00 Подготовка рукописи по MOC ЕС 10.00- 10.15 Физпауза 10.15-13.00 НТК по технологии программирования 13.00- 14.00 Овед 121
14.00- 16.00 Генерация СУРБД INGRES 16.00- 16.15 Физпауза 16.15-17.45 Поведение консультаций по MOC ЕС 17.45 Конец равочего дня -ГОТОВО-> cat plan Ь="План равоты на" с=”Равота Вами не запланирована" for in do case $in in понедельник) echo $b $in if test -r pon then cat pon else echo $c f i • • 19 9 . вторник) echo $b $in if test -r vtor then cat vtor / else echo $c fi',7 среда) echo ''$b среду" if test -r sreda then cat sreda else echo $c f i;; четверг) echo $b $in if test -r tchet then cat tchet else echo $c f i; ; пятница) echo "$b пятницу” if test -r pyat then cat pyat else echo $c f i • • ' 1 t r суввота\воскресенье) echo нПлан на выходные дни if test -r vyhod then cat vyhod else echo "$c .ОТДЫХАЙТЕи fi; ? *; echo иДень недели указан не верном echo $in;; esac done -ГОТОВО-> 122
sh plan среда пятница воскресенье План равоты на среду 8.30-10.00 Подготовка рукописи по MOC ЕС 10.00- 10.15 Физпауза 10.15- 13.00 НТК по технологии программирования 13.00- 14.00 Овед 14.00- 16.00 Генерация СУРБД INGRES 16.00- 16.15 Физпауза 16.15- 17.45 Поведение консультаций по MOC ЕС 17.45 Конец равочего дня План равоты на пятницу Равота Вами не запланирована План на выходные дни Равота Вами не запланирована .ОТДЫХАйТЕ День недели указан не верно всресенье -ГОТОВО-> Язык shell позволяет распараллеливать выполнение от¬ дельных ветвей shell-процедуры, используя средства за¬ пуска в фоновом режиме (операторы & и back, см. гл. 5). Для управления выполнением параллельных ветвей в языке shell используется оператор wait (ждать) следующего формата: wait [идентификационный номер процесса] Команда wait приостанавливает выполнение процедуры до завершения процесса с заданным идентификационным номе¬ ром. Если идентификационный номер не указывается, то процесс приостанавливается до завершения всех фоновых процессов, запущенных в данной процедуре. Напомним, что идентификационный номер процесса, запускаемого в фоновом режиме, сохраняется в системной переменной с именем /. Пример 8.7. -ГОТОВО-> cat sortcat sort <$l>/tmp/l & a=$! sort <$2>/tmp/2 & b=$! wait $a wait $b sort -m /tmp/l /tmp/2 123
-готово-> cat fl 8 4 6 2 -ГОТОВО-> cat f2 0 5 7 3 9 1 -ГОТОВО-> sh sortsl f1 f2 0 1 2 3 4 5 6 7 8 9 -ГОТОВО-> В данном примере приведена процедура sortsl, пред¬ назначенная для слияния после сортировки двух файлов (fl и f2). При этом сортировка файлов выполняется в асин¬ хронном (в фоновом) режиме. Слияние файлов может быть начато только после окончания сортировки обоих файлов (wait $a и wait $b). Слияние файлов выполняет команда sort с флагом -m. Остановимся еще на одном операторе языка shell. Это оператор trap, обеспечивающий обработку сигналов пре¬ рывания, возникающих вследствие различных ненормальных ситуаций. Хотя монитор shell управляет обработкой боль¬ шинства этих сигналов, ряд из них передается активной в данный момент sheU-процедуре, а именно: сигнал 1 - при отключении терминала; сигнал 2 - при нажатии клавиши DEL (ПА1 на терминале EC7920); сигнал 9 - при выполнении команды kill -9 номер_ процесса (уничтожить пооцесс); 124
сигнал 15 - при выполнении команды kill без флагов (программное завершение процесса). Посредством команды trap sheU-процедура может пере¬ хватывать и обрабатывать или игнорировать каждый из этих сигналов (за исключением сигнала 9). Если sheU-процеду- pa не перехватывает сигналы прерывания, то монитор sheU прекратит ее выполнение. В ряде случаев это может при¬ вести к потере информации, хранящейся в файлах, создава¬ емых уничтожаемой процедурой, или, наоборот, к засорению файловой систеМы "мусором", т.е. временными файлами, которые при нормальном завершении должны были быть уничтожены. Команда trap имеет следующий формат: trap "список^команд" сигналы Список команд должен заключаться в кавычки, при этом если в список входит более одной команды, то они должны разделяться точкой с запятой. Команда trap указывает монитору sheU, какие действия (поле список-команд) необходимо выполнить при возник¬ новении одного из сигналов, указанных в поле сигналы. Работу команды trap покажем на примере sheU-проце- дуры tele, которая выдает список активных абонентов системы. Но в отличие от команды who она выдает не только идентификатор пользователя, но и его фамилию, телефон и место работы (отдел). Эта процедура окажет весьма полезную услугу тем, кто пользуется электронными почтой и телефоном (см. гл. 1). Пример 8.8. -ГОТОВО-> cat tele trap "rm -f /tmp/tmpfile" 1 2 15 a=*who*;set $a;tty=$2;data=$5 until false do set *grep$l /etc/identity* echo $1 $data $tty $3 $5 $7 >>/tmp/tmpfile set $a;ni-5 while test $ni -ge 1 do shift;ni-*expr $ni - 1‘ done a-*echo $*';tty=$2;data=$5 125
if test -z "$J" then cat /tmp/tmpfile;rm -f /tmp/tmpfile; exi t fi done -ГОТОВО-> sh teie r031 18:38 tty3cl 041 2081 Хивухин a513 18:40 tty3c2 115 2042 Орлов z010 18:25 tty3c0 081 2879 Кочергин f063 18:26 ttyOcO 033 2254 Чернышов q038 18:25 ttyOcl 021 2347 Тесленко z002 18:29 ttyOc2 085 9369 Баскаков r050 18:25 ttyOc3 041 2017 Олейник -ГОТОВО-> Как было обещено в ] гл. 4, приведем тексты sheU-npo- u,ejjypheadncolrm. Пример 8.9. .-готово-> cat head if test —n "$2";then cat $2>/tmp/head else cat>/tmp/head fi bb=$l if test *expr "$1" : "\-"' -ne 0 then bb="\$$l" echo "l,$bb"p|ed - /tmp/head else echo "l''>/tmp/hd;echo " .$l">>/tmp/hd echo "l,.-lp">>/tmp/hd ed - /tmp/head</tmp/hd>/tmp/hl;rm -f /tmp/hd fi rm -f /tmp/head;echo "3,\$p"\ed - /tmp/hl rm -f /tmp/hl -ГОТОВО-> Процедура Леял? обеспечивает считывание из входного файла его "головы” и запись ее в стандартный вывод. Обращение к процедуре имеет вид: head число имя^срайла 126
Число со знаком + (например, +8) указывает, сколько записей, начиная с первой записи файла, считать, а число со знаком - (например, -12) указывает на то, что нужно считать все записи файла, за исключением того количества записей, которое указано (в нашем примере за исключе¬ нием 12). Пример 8.10. -ГОГОВО-> cat colrm cat>/tmp/clr ee="";rr='expr $1 - 1' until test $rr -eq 0 do ee=*'.$ee'';rr=*expr $rr - 1‘ done if test $# -eq 1 then aa=".*";dd="" else cc='expr $2 - $l';aa="." until test $cc -eq 0 do aa=".$aa";cc=*expr $cc - 2' done dd=".*" fi echo ’4,\$s/\\("$ee"\\)"$aa"\\("$dd"\\)/\\l\\2/g" \ >/tmp/colrn echo " 1, W$''p>>/tmp/colrn ed - /tmp/clr</tmp/colrn rm -f /tmp/colrm -ГОТОВО-> Функции, выполняемые процедурой colrm, подробно опи¬ саны в гл. 4. Пример 8.11. -ГОТОВО-> who]head +3|tee oo r031 18:38 tty3cl 041 2081 Хивухин a513 18:40 tty3c2 115 2042 Орлов z010 18:25 tty3c0 081 2879 Кочергин 127 -ГОТОВО-> colrm 6 26 <oo r031 Хивухин a513 Орлов
zOlO Кочергин -ГОТОВО-> Данный пример наглядно демонстрирует возможности процедур head и colrm. Процедура head считывает из стан¬ дартного вывода команды who первые три записи. Процедура colrm вырезает из него ненужные колонки и оставляет только идентификатор пользователя и его фамилию. Мы закончили рассмотрение основных возможностей sheU- языка и приемов программирования на нем. В заключение остановимся на том, когда целесообразно программировать на языке sheU. Мы глубоко убеждены, если проектируемая программа связана с выполнением большого числа операций, являющихся функциями системы MOC ЕС, то она должна разрабатываться на языке sheU. Более того, если проек¬ тируемая программа должна быть разработана на языке высокого уровня (Си, Фортран 77, Паскаль и др.), то для проверки правильности построения ее алгоритма рекоменду¬ ется разрабатывать макет программы на языке sheU. Это позволит на ранних стадиях проектирования программы выя¬ вить все ее узкие места, убедиться в работоспособности алгоритма, провести хорошее документирование проекта и т.д. Перевести же программу, написанную на языке shell, на другой язык, как читатель уже, наверное, убедился, особых проблем не составит. В качестве рекомендации заметим, что shell-процедуры удобно создавать в файлах, имена которых заканчиваются на суффикс .sh, например paket.sh, head.sh и т.д. Это удобство заключается в том, что, когда с помощью редактора ned готовится текст shell-процедуры в файле, имя которого оканчивается на <sh, достаточно вводить только первое ключевое слово операторов if, while, until, case, после чего редактор автоматически дост¬ раивает структуру оператора. Пользователю остается только вставить необходимые выражения, списки команд и (или) метки. Для отладки sheU-процедур не забывайте пользоваться отладочными возможностями монитора shell (см. гл. 6).
Раздел 3. ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ О MOC ЕС Глава 9. СТРУКТУРА ФАЙЛОВОЙ СИСТЕМЫ MOC ЕС К наиболее важным средствам MOC ЕС относится ее ие¬ рархическая файловая система. Файловая система разраба¬ тывалась в первую очередь для удобства пользователей и упрощения доступа к данным. Это обусловило необходимость реализации группировки файлов в каталоги (см. гл. 3). Пользователь MOC ЕС имеет дело с тремя типами файлов: обычными файлами, каталогами и специальными файлами. Обычным файлам (в том числе и каталогам) был посвящен весь предыдущий материал. Специальные файлы представляют собой единственный способ прямою доступа к периферийным устройствам (тер¬ миналам, внешним запоминающим устройствам, каналам вво¬ да-вывода и т.п.). Специальные файлы (в отличие от обыч¬ ных файлов) не содержат никакой информации и используют¬ ся в качестве канала доступа к внешним устройствам. С каждым подключенным к ЭВМ устройством (перфокарточным вводом, терминалом, диском, мини-диском, лентой и т. д.) связывается специальный файл, характеризующий это уст¬ ройство, за которым закрепляется программа, называемая драйвером, обеспечивающая обмен данными с этим устройс¬ твом. Как только данные появляются в специальном файле, драйвер, который закреплен за этим файлом, выполняет их форматизацию в соответствии с характеристиками внешнего устройства и осуществляет вывод данных на это устройс¬ тво. Аналогично выполняется и ввод данных (если внешнее устройство является терминалом), после которого драйвер выполняет их расформатизацию, удаляет служебные символы и записывает данные в чистом виде в соответствующий спе¬ циальный файл. 5 Заказ № 1154 129
Рис. 9.1. Перераспределение стандартного ввода-вывода 130
Так, рассмотренные ранее стандартные файлы ввода, вы¬ вода и вывода диагностики монитора shell представляют собой специальные файлы. Перед запуском любой программы монитор shell перераспределяет ее стандартные ввод и вы¬ вод на выделенные в качестве стандартных специальные файлы ввода и вывода монитора shell и тем самым обеспе¬ чивает возможность диалогового обмена данными с програм¬ мой (рис. 9.1). В качестве стандартных специальных фай¬ лов ввода и вывода монитора shell для каждого терминала выступает форматизированный специальный файл, закреплен¬ ный за этим терминалом. При этом строки 1 - 22 исполь¬ зуются для вывода информации, а строки 1 и 2 - для ввода данных. Имя специального файла терминала можно узнать, выполнив команду tty: Пример 9.1. -готово-> tty /dev/ttyOc2 -готово-> В случае переадресации монитором shell стандартного ввода и вывода программы по запросу пользователя текст самой программы остается без изменений, поскольку сохра¬ няется механизм доступа к обычным файлам (использование j. операторов read и write), Меняются только источники I входных и выходных данных и окружение монитора shell, в | котором выполняется программа. | Специальные файлы в основном сгруппированы в каталоге /dev, а их имена обычно ассоциируются с типом соответс- I твующего устройства (tfy-терминал, dsk - диск, mem f оперативная память и т.п.). Естественно, что в системе может быть несколько однотипных устройств (например, несколько терминалов или дисков). В этом случае имена дополняются логическими номерами устройств, например: / dev/tty3c2, /dev/tty9c2, /dev/dsk750, /dev/dsk75B и т.п.). Для того чтобы узнать, какие в системе есть спе¬ циальные файлы (а точнее, какие устройства подключены), достаточно просмотреть каталог /dev, воспользовавшись командой ls: -готово-> ls -als /dev 2 drwxr-xr-x 4 root 1 drwxrwxr-x29 root 5* 5360 Jan 25 10:14 . 480 Mar 14 12:29 .. 131
0 crw 1 root 0, 0 Mar 18 09:, 37 cons 4 brw 1 root 64, 0 Jan 10 16:45 dskl30 2 brw 1 root 22, 0 Jan 10 16:45 dsk756 1 crw 1 root 8, 64 Jan 10 16:45 fdskl30 1 crw 1 root 8, 66 Jan 10 16:45 fdsk756 1 drwxr-xr-x 2 root 112 Jan 10 16:45 kmem 1 crw-r—r 1 root 13, 0 Mar 18 09:37 mem 1 crw-rw-rw- 1 root 6, 0 J ап 10 16:45 mtl80 1 CrW-TW-rW- 1 root 9, 0 Feb 24 12:19 nsw011 1 crw-rw-rw- 1 root 9, 1 Feb 24 13:04 nsw611 1 crw-rw-rw- 1 root 13, 1 Mar 18 09:37 nul 1 1 c-w 1 root 3, 0 Mar 17 18:54 printerOOf 1 c-w 1 root 3, 1 Jan 10 16:45 printer60f 1 c-w 1 root 2, 0 Mar 3 18:35 punchOOd 1 c-w 1 root 2 / 1 Jan 10 16:45 punch60d 1 crw 1 root 7, 64 Jan 10 16:45 rdskl30 1 crw 1 root 7 / 66 Jan 10 16:45 rdsk756 1 cr — r — r 1 root 1, 0 Jan 10 16:45 readerOOc 1 cr—r—r 1 root 1, 1 Jan 10 16:45 reader60c 1 cr—г—r 1 root 11, 0 Jan 10 16:45 smsqO 1 cr—r—r 1 root 11, 1 Jan 10 16:45 smsql 1 СГ *— 1 root 14, 0 Jan 10 16:45 taq 1 drwxrwxr-x 2 root 32 Jan 10 16:45 tape 1 crw-rw-rw- 1 root 15, 0 Feb 15 18:29 tty 1 crw—w—w2- -1 z002 4, 32 Mar 18 11:19 ttyOcO 1 crw—w—w- 1 a513 4, 34 Mar 18 11:34 ttyOc2 1 crw—w—w- 1 root 4, 0 Mar 17 13:56 tty3cl 1 crw—w—w- 1 root 4, 10 Feb 17 09:18 tty3cb 1 crw-rw-rw- 1 root 5, 33 Mar 18 11:33 tubOcl 1 crw-rw-rw- 1 root 5, 35 Mar 17 18:20 tub3cb 1 crw 1 root 10, 0 Mar 18 09:37 vcfO 1 crw 1 root 10, 1 Jan 10 16:45 vcfl 1 crw 1 root 10, 2 Jan 10 16:45 vcf2 1 crw-rw-rw- 1 root 12, 0 Jan 10 16:45 vmcfO 1 crw-rw-rw- 1 root 12, 1 Jan 10 16:45 vmcf 1 -готово-> Таким образом, совокупность специальных файлов в ка¬ талоге /dev однозначно определяет комплекс внешних уст- 132
ройств, включенных при запуске MOC ЕС в работу с систе¬ мой. Если пользователь внимательно проанализирует содержи¬ мое каталога /dev, то заметит, что в нем существуют фай¬ лы, связанные с одним и тем же внешним устройством. Так, файлы ttyOcl и tubOcl связаны с одним и тем же термина¬ лом, имеющим логический адрес Ocl. Это объясняется тем, что с одним и тем же внешним устройствоми (диском, тер¬ миналом) могут работать разные драйверы ввода-вывода, обеспечивающие различные режимы их работы. Как правило, одним из таких драйверов бывает драйвер, поддерживающий прозрачный режим устройства. Отличие его заключается в том, что он обеспечивает обмен данными непосредственно между терминальным файлом пользовательского процесса и внешним устройством без их предварительной буферизации и форматизации (рис. 9.2). Одновременно каждый пользовательский процесс имеет доступ к внешнему устройству только через один специаль¬ ный файл (драйвер). Для смены режима работы с устройс¬ твом процесс должен закрыть оператором close старый тер¬ минальный файл и открыть оператором open новый. Для пользователя специальные файлы ничем не отличают¬ ся от обычных файлов, и он может с ними работать, как с обычными файлами, используя, например, средства переад¬ ресации. Пример 9.2. -ГОТОВО-> cat file>/dev/tty3c2 -ГОТОВО-> В данном примере содержимое файла file направляется в специальный файл /dev/tty3c2, который обеспечивает вывод файла на принтер EC7934. На практике пользователь очень редко обращается не¬ посредственно к специальным файлам, так как обращение к ним идет в основном через команды монитора shell. В системе MOC ЕС различают два типа специальных фай¬ лов: байториентированные (тип с) и блокориентированные (тип b). Байториентированные специальные файлы выполняют посимвольный обмен с внешними устройствами, блокориенти¬ рованные - блоками. Так, обмен с дисками в MOC ЕС выпол¬ няется блоками длиной 4096 байт. В гл. 10 работа со специальными файлами будет рас¬ смотрена более подробно на примере работы со специаль- 133
Рис. 9.2. Ввод-вывод пользовательского процесса через обычный и прозрачный драйверы 134
ными файлами, обеспечивающими интерфейс с терминалами типа EC7920. Скрытой частью файловой системы являются индексные дескрипторы файлов (в том числе каталогов и специальных файлов), которые вместе с их именами хранятся в соот¬ ветствующих каталогах. Файловые системы создаются на томах прямого доступа (например, магнитные диски), которые имеют одинаковую логическую структуру независимо от их типа. Отметим, что в MOC ЕС в качестве томов прямого доступа может высту¬ пать весь магнитный диск или мини-диски, созданные на нем. Каждый том представляет собой логическую последова¬ тельность блоков по 4096 байт. Это отличительная особен¬ ность MOC ЕС, так как в большинстве систем типа ЮНИКС длина блока равняется 512 байтам. Форматирование томов прямого доступа выполняется ко¬ мандой format, хранящейся в каталоге /etc, которая име- етследующий формат: /etc/format том_прямого__доступа или f ormat том_прямого__доступа Команда fomiat расписывает весь том, начиная с дорож¬ ки 1 цилиндра 0, блоками по 4096 байт, в которые записы¬ ваются нули. На каждой дорожке записывается максимально возможное количество блоков. Блоки имеют номера, начиная с нуля. В нулевой блок записываются номера сбойных бло¬ ков, обнаруженных при форматировании. Эта информация ис¬ пользуется в дальнейшем при создании файловой системы. Том прямого доступа задается его физическим адресом или именем байториентированного специального файла в следующем виде: /dev/fdsk физический__адрес Например, команды /etc/format 141 и format /dev/ fdskl41, предназначенные для форматирования тома прямого доступа с физическим адресом 141, эквивалентны. После того как том прямого доступа отформатирован, можно приступать к созданию на нем файловой системы. Создание файловой системы заключается в создании специ¬ альных управляющих структур, позволяющих пользователям создавать в ней файлы. 135
Создание файловой системы выполняется по команде mkfs, хранящейся в каталоге /etc (т.е. /etc/mkfs): mkfs том_прямого__доступа [количество__Блоков] Том прямого доступа задается именем его блокориенти- рованного специального файла ^/dev/dsk<pu3U4ecKuU_adpec) или просто его физическим адресом, например mkfs 141 или mkfs /dev/dskl41. Команда mksf создает новую файловую систему на томе прямого доступа, состоящую из того количества блоков, которое задано в поле количество-блоков. Если поле коли- чество_бяоков опущено, то файловая система создается на весь том. Рассмотрим структуру файловой системы, создаваемой на томах прямого доступа (рис. 9.3). БЛОКИ для размещения индексных дескрипто¬ ров файлов Блоки для размещения файлов Блок 0 - Блок начальной загрузки Блок 1 - суперБлок Блок 2 Блок N БЛОК N+1 Последний Блок Рис. 9.3. Размещение файловой системы на томе прямого доступа Первый блок (блок 0) любой файловой системы использу¬ ется служебными командами MOC ЕС и, в частности, содер¬ жит номера сбойных блоков тома (см. команду format). Ес¬ ли файловая система является резидентом MOC ЕС (т.е. содержит корневой каталог файловой системы с именем /), то в данном блоке также размещается программа начальной загрузки системы. Второй блок, или, как его называют, суперблок содер¬ жит заголовок файловой системы, первоначально формируе- 136
мый по команде mkfs и постоянно обновляемый по мере соз¬ дания, уничтожения и модификации файлов. Заголовок фай¬ ловой системы, вчастности, содержит: размер тома прямого доступа в блоках; размер в блоках списка индексных дескрипторов; число и список свободных блоков; число и список свободных индексных дескрипторов. Основным элементом файловой системы является индекс¬ ный дескриптор. Любой файл (обычный, каталог или специ¬ альный файл) определяется его индексным дескриптором, содержащим всю необходимую системе информацию о нем. Поскольку дескриптор имеет фиксированный размер (64 бай¬ та) и нумерация дескрипторов осуществляется последова¬ тельно, начиная с единицы, любой из них можно найти по его номеру. Индексные дескрипторы располагаются по 64 в блоке, начиная с блока 2. В системе дескрипторы с индек¬ сами 1 и 2 имеют специальное назначение. Дескриптор 1 описывает файл, содержащий сбойные блоки данного тома прямого доступа и создаваемый по команде mkfs (создать файловую систему). Дескриптор 2 стандартно выделяется для корневого каталога файловой системы. Все остальные индексы специального назначения не имеют. В индексном дескрипторе хранится следующая информация о файле: код защиты и тип файла (каталог, обычный или специ¬ альный файл); число связей файла (созданных по команде ln); идентификатор владельца файла; идентификатор группы, которой принадлежит пользова¬ тель; время последнего доступа и время последней модифика¬ ции файла; время создания или время последней модификации деск¬ риптора; размер файла в байтах; список занимаемых блоков на томе прямого доступа; Для специальных файлов в индексном дескрипторе вместо списка блоков хранится код устройства. Отметим, что в индексном дескрипторе не хранится имя файла, так как оно вместе с номером индексного дескрип¬ тора файла хранится в каталоге. Ключом, задающим расположение файла на диске, служит список блоков. Список блоков, хранящийся в индексном дескрипторе, содержит 13 элементов. Первые 10 элементов предназначены для хранения первых десяти номеров блоков файла. В том случае, когда длина файла превышает 10 бло- 137
> 10 1023 1024 1024 Блоков двойной косвенности 1024 Блоков косвенности Блоки файла Рис. 9.4. Организация хранения файлов 138
ков (40960 байт), первые десять элементов списка ссыла¬ ются на блоки файла,а одиннадцатый - па блок, в котором размещается список следующих 1024 блоков файла. Этот блок называют простым косвенным блоком. Для файлов, дли¬ на которых болыпе, чем 1034 ( 1024 + 10 ) блока, (4235264 байта), двенадцатый элемент содержит адрес двойного косвенного блока, включающего список адресов 1024 простых косвенных блоков (каждый из, которых в свою очередь содержит адреса 1024 блоков на диске). Если жс файл длиннее, чем 10 + 1024+1024**2 блока, то в тринадца¬ том элементе списка хранится адрес тройного косвенного блока (рис. 9.4). Следовательно, максимальная длина фай¬ ла в MOC ЕС 10+1024+1024**2+1024**3 Блока или (10+1024+1024**2+1024**3)*4096 Байт. Итак, мы рассмотрели хранимые па диске структуры, об¬ разующие скелет файловой системы. К ним относятся су¬ перблок, индексные дескрипторы, каталоги файлов, обычные и специальные файлы. Однако создание файловой системы на диске еще не означает, что она доступна пользователям MOC ЕС. Для того чтобы система MOC ЕС начала функционировать, необходимо загрузить ее ядро. Загрузка ядра выполняется программой начальной загрузки, хранящейся в блоке 0 кор¬ невой файловой системы (имя f). Диск, на котором хранит¬ ся корневая файловая система, называют резидентным. Кор¬ невая файловая система хранит наиболее важные команды и файлы системы. Структура корневой файловой системы MOC ЕС приведена на рис 9.5. По окончании процедуры началь¬ ной загрузки ядру системы доступными оказываются только файлы корневой файловой системы. Для того чтобы проинформировать ядро системы о нали¬ чии других файловых систем, необходимо выполнить команду mount, хранящуюся в каталоге /etc: mount имя_срайловой_системы полное__имя_каталога [-r] Команда mount обеспечивает логическое соединение фай¬ ловой системы с некоторым доступным для этой цели ката¬ логом. Этот процесс называют монтированием файловой сис¬ темы. Имя файловой системы задается именем блокориен- 139
тированного специального файла Q'dev/dsk*) по аналогии с командой mkfs. Начальным каталогом монтируемой файловой системы становится каталог, имя которого указано в поле пояное_имя_катаяога. Этот каталог к моменту выдачи ко¬ манды должен существовать и быть пустым. Флаг -r предпи¬ сывает монтировать файловую систему только на чтение. Рис. 9.5. Корневая файловая система MOCEC Для демонтирования файловой системы используется ко¬ манда umount: umount имя__файловой__системы Следует иметь в виду, что команда umount будет выпол¬ нена только в том случае, если ни один пользователь (процесс) не имеет доступа к демонтируемой файловой сис¬ теме. Отметим, что монтируемая файловая система может быть как пустой (т.е. созданной по команде mkfs), так и со¬ держащей файлы. Команды mount и umount удобно использовать, например, когда имеются группы пользователей, работающие в различ¬ ное время, и испытывается недостаток в накопителях на магнитных дисках. В этом случае каждая группа имеет свой диск со своей файловой системой, и при очередном сеансе администратор (оператор) системы проводит перемонтирова- ние файловых систем. Для того чтобы узнать, какие в данный момент времени в системе смонтированы файловые системы, достаточно вы¬ полнить команду mount без параметров. 140
Пример 9.3. -ГОТОВО-> mount имя_файловой_системы начальный_каталог файловой системы dsk75B on / dskl55 on /mntsys/u5 dsk752 on /mntsys/ul dsk753 on /mntsys/ul15 dsk754 on /inqres dsk755 on /mntsys/uwc dsk756 on /usr/dok dskl37 on /tmp dskl36 on /usr/spool/out -ГОТОВО-> Информацию о свободном пространстве в файловой систе ме можно получить по команде df: df имя__срайловой_системы или df имя_начального_каталога Пример 9.4. -ГОТОВО-> df /dev/dsk755 disk total % full free file system /dev/dsk755 3303 49.3 1676 /mntsys/uwc -ГОТОВО-> Если же пользователь хочет узнать, сколько блоков за нимает его каталог, то необходимо выполнить команду: du имя_каталога Пример 9.5. -готово-> du /mntsys/ul151/a513/KNIGA 99 /mntsys/ul151/a513/KNIGA -ГОТОВО-> 141
Для того чтобы узнать, сколько блоков, включая блоки косвенной адресации, занимают файлы, хранящиеся в ката¬ логе, можно воспользоваться командой ls с ключом -s. Пример 9.6. -ГОТОВО-> ls -s total 59 1 аннотация 10 глава2 5 главаЗ 6 глава4 7 главаБ 15 ингрес 10 приложение 5 введение -ГОТОВО-> t лава 10. ПРОГРАММИРОВАНИЕ ДИАЛОГОВЫХ ПРОГРАММ В MOC ЕС 10.1. Построчный и экранный режимы работы Как отмечалось выше (см. гл. 9), диалог в пользо¬ вательском процессе может осуществляться через файлы ttyXXX и tubXXX, где XXX - логический адрес терминала. Файл ttyXXX поддерживает работу процесса с обычным драй¬ вером терминала, обеспечивающим построчный режим ввода-вывода. В этом режиме драйвер сам осуществляет форматизацию экрана терминала (строки 1-22 - поле выво¬ да; строки 23, 24 - иоле ввода) и размещение на нем вво¬ димых и выводимых данных. При этом пользователю предос¬ тавляется возможность осуществлять ввод данных, длина которых не превышает 120 символов. Размер выводимой информации на экран терминала практически неограничен. Построчный режим работы является основной формой ди¬ алогового взаимодействия пользователя с MOC ЕС и своими прикладными программами. Он значительно облегчает работу пользователя при написании программ ввиду того, что весь мсхацизм управления экраном терминала и размещения на нем информции скрыт от пользователя. Тем не менее 142
существует целый класс задач, в которых построчный режим работы не удовлетворяет требованиям реализуемых в них функций. Так, в некоторых задачах автоматизированного ? проектирования, имитационного моделирования, оперативно- f го управления у пользователя возникает необходимость ра¬ боты со всей информацией, отображаемой на экране терми¬ нала. При этом ему самому необходимо определять поля ввода и вывода, модифицируемые и немодифицируемые, отоб¬ ражаемые и неотображаемые, управляемые световым пером и неуправляемые. Возможность экранного режима работы обеспечивается путем использования в качестве терминального файла про¬ цесса файла с именем tubXXX. В этом случае диалог орга¬ низуется через прозрачный интерфейс, и пользователю пре¬ доставляется возможность самому осуществлять управление экраном терминала. В процессе форматизации экрана [2], , пользователь самостоятельно указывает начальные адреса 1 полей ввода и вывода информации, осуществляет ее переко- | дировку (см. разд. 10.4.). Осуществляя ввод информации в ^ экранном режиме, пользователь должен сам анализировать и [ обрабатывать все сигналы прерывания, поступающие с тер- \ минала, а также осуществлять обратную перекодировку информации и удалять все служебные символы. | Необходимо отметить, что программы, рассчитанные на ; построчный режим работы, более независимы от типа внеш- I него устройства, поскольку не учитывают их особенности и ^ технические характеристики, как это делается в програм¬ мах, работающих с "прозрачным" интерфейсом. К тому же, j> применяя в качестве источника ввода-вывода стандартный [ входной и выходной файл, программист имеет возможность пользоваться преимуществом универсальности файловой сис¬ темы MOC ЕС. 10.2. Средства программирования в экранном режиме Программисты, занимавшиеся разработкой интерактивных программ, поддерживающих диалог в режиме полного экрана, знают, насколько это трудоемкая задача, требующая боль¬ шого опыта в области системного программирования. В MOC ЕС существуют средства программирования для алфавитно- цифровых дисплеев, позволяющие значительно уменьшить трудозатраты по созданию диалоговых программ, работающих в экранном режиме, сделать доступной возможность их разработки прикладным программистом. 143
Пакет QUICKSCREEN предназначен для организации в прикладных программах, написанных на языке Си, диалога в режиме полного экрана на терминалах типа EC7927. Пакет включает в себя препроцессор и набор встроенных функций, реализованных как функции языка Си. В функции препро¬ цессора входит перевод специальных конструкций пакета, предназначенных для описания сценария диалоговой работы программы, и обращения к этим встроенным функциям, непосредственно осуществляющим диалог. 10.2.1. Общие правила использования пакета QUICKSCREEN Конструкциц пакета QUICKSCREEN могут встречаться внутри программмы на языке Си в любом порядке. Они начи¬ наются с ключевого слова: . at, panel, erase или copyscreen, которое должно быть первым словом строки. Имя файла, включающего конструкции пакета, должно иметь окончание .q. Констр^ция at определяет позицию, с которой распо¬ лагается информация на экране терминала (фактически адрес на экране терминала, с которого располагаются поля ввода-вывода). Она помещается перед конструкцией panel и имеет следующий вид: at строка, гюзиция__в_строке; Здесь поля строка и позиция_в_строке представляются выражениями языка Си, являющимися переменными целого типа или целыми константами. Например: at 12,30; panel { Проверка пакета QUICKSCREEN } В результате работы данного примера буква П будет располагаться в 30-й позиции 12-й строки. Операторы int str,poz; str = 10; poz = 20; ai str,poz; 144
^•ЩР^'ЧГ' panel { } вызывают расположение информации начиная с 20-й позиции 10-й строки. Вместо явной конструкции at пользователь может использовать встроенную (см. п. 10.4.2). Конструкция panel осуществляет вывод текста сообщения на экран и ввод ответа пользователя. Общий вид конст¬ рукции: рапе1(список команд) { текст ,,v > Список команд представляет собой команды, разделенные запятой, и не является обязательным элементом конструк¬ ции. Если в конструкции panel отсутствует текст, фигур¬ ные скобки можно заменить точкой с запятой: I •■■* рапе1(список команд); Справа от конструкции panel можно расположить | * комментарии в соответствии с синтаксисом языка Си. 1 Конструкция erase вызывает следующие действия: все поля ввода на экране очищаются (заполйяются нуля- 0; курсор помещается в начало первого поля ввода; ожидается ввод данных пользователем; после нажатия пользователем клавиши ВВОД введенные & данные сохраняются в указанных переменных. Конструкция erase записывается в виде erase input; Она широко используется в программах заполнения блан¬ ков, где необходимо несколько раз вводить данные одного и того же вида. Такая программа, используя конструкцию panel в первый раз, может отобразить бланк на экране и осуществить ввод данных. Затем в такой программе будет работать цикл, включающий обработку введенных данных и конструкцию erase: [ at 1,1; panel { Формирование шавлона вланка 145
} Овравотка введенных данных while (тело цикла) { erase input; Овравотка введенных данных } Конструкция copyscreen вызывает копирование экрана в массив символов: char bufer[bufsize]; copyscreen(bufer); Размер экрана bufsize должён быть не меньше размера текущего экрана, который определяется как произведение числа строк на число позиций в строке + 1. В массиве будет размещаться содержимое всех строк экрана, оформ¬ ленных в виде строки символов, завершающейся нулем (\0). При этом пустые поля на экране представляются пробелами. Буфер, содержащий образ экрана, можно использовать для получения твердой копии экрана. 10.2.2 Конструкция panel Каждая конструкция panel предусматривает вывод инфор¬ мации на экран терминала и ввод ее после нажатия пользо¬ вателем клавиши ВВОД. Текст, присутствующий в конструк¬ ции, может включать: неизменяющийся текст (явно заданную символьную стро¬ ку), предназначенный для вывода на экран; встроенные поля, определяющие поле переменной длины (символьный массив или символьная строка языка Си) и его тип (поле ввода или поле вывода, отображаемое или неотображаемое и т.д.); встроенные конструкции at. Отступ текстовых строк от левой границы при их записи в конструкции panel не влияет на их расположение на экране терминала. Два следующих примера вызовут одина¬ ковое расположение на экране. panel { Пример равоты пакета QUICKSCREEN ' 146
} panel { Пример равоты пакта QUICKSCREEN } Важным является только расположение строк относи¬ тельно друг друга (в данном примере расцоложение второй строки относительно первой со смещением на 3 символа). Неизмеияющийся текст выводится на экран с обычной яркостыо. Если необходимо вывести текст с повышенной яркостыо, его надо оформить в виде символьной строки языка Си и использовать ее в качестве параметра встроенного поля. Встроенные поля включаются в текст конструкции panel для ввода и вывода переменных и задаются в виде: # тип, переменная, длина§ Каждый из трех компонентов представляет собой вы¬ ражение языка Си. Элемент тип определяет тип встроенного поля: является ли оно входным или выходным; отображается оно с обычной или повышенной яркостыо или вообще не отображается; должен ли курсор размещаться в начале поля. Тип поля может задаваться номером или именем в соответствии с табл. 10.1. Следующий элемент встроенного ноля - переменная должен быть указателем па символ, символьную строку или символьный массив. Он указывает на информацию, которая должна быть выведена па экрап. В случае поля ввода - это массив символов, в который будет помещена вводимая пользователем информация. Последний элемент поля - длина - определяет длину поля. На экран помещается количество элементов массива, определяемое этим компонентом встроенного поля. Если внутри массива встречается нулевой байт (\0), оставшаяся часть поля заполняется нулями, которые отображаются на экране пробелами. В случае поля ввода длина определяет максимальное количество символов, сохраняемых в массиве. Размер массива при этом должен быть не меньше длина + 1 байт, так как в конце массива добавляется нулевой байт. Если длина меньше длины массива, то оставшаяся часть массива пе очищается. 147
T а б л и ц а 10.1 г имя | НОМЕР И 1 | ЗНАЧЕНИЕ | I ; I ON | 1 И I | поле вывода овычной яркости | он | 2 j поле вывода повышенной яркости | OI | 3 | поле вывода неотовражаемое | IN | 4 | поле ввода овычной яркости | IH I 5 j поле ввода повышенной яркости \ II I 6 | неотовражаемое поле ввода | INC | 7 | поле ввода овычной яркости, 1 | включающее курсор IHC | 8 | поле ввода повышенной яркости, | | включающее курсор | IIC | I L 6 j неотовражаемое поле ввода, | | включающее курсор | _J : I Поля ввода являются одновременно и полями вывода. Содержимое переменной помещается на экран, и пользо¬ ватель может изменить его. Если необходимо, чтобы поле в начале работы было пустым, первый байт массива, ука¬ занного элементом переменная, должен быть нулевым. Поле вывода предназначено только для вывода информации и содержимое его не может быть изменено пользователем. Попытка изменить содержимое поля вывода вызывает бло¬ кировку клавиатуры. Приведем пример программы, работающей со встроенными полями: main() { char name[10]; strcpy(name,"Владимир"); at 1,10; panel { Измените Ваше имя: # INC,name,9# } } Эта программа выведет на экран терминала текст: Измените Ваше имя: Владимир Текст будет располагаться начиная с 10-й позиции 1-й строки. Курсор будет установлен на букву В в слове 148
Владимир. Пользователь может изменить имя, печатая поверх существующего, вставляя, уничтожая и добавляя буквы. Попытка набрать имя, содержащее более 9 букв, вызовет блокировку клавиатуры, так как максимальный размер поля ввода равен 9 символам. Если пользователь, например, изменит имя Владимир на Андрей и нажмет клавишу ВВОД, в массиве будет помещена строка Андрей. Ниже приводятся некоторые особенности синтаксиса встроенных полей: если тип поля задается номером, запятая после него может быть опущена; если длина поля <=0 или отсутствует (вместе с пред¬ шествующей запятой), она определяется как strlen(nepe- меннаа), где strlen - функция стандартной библиотеки языка Си, определяющая длину в байтах символьного массива; если между символами # находится только одна пере¬ менная, она воспринимается как значение поля переменная. В этом случае типом поля считается ON (по умолчанию), а длина поля определяется как strlen(nepeMemaa)\ встроенные поля не должны сливаться. Между ними должен быть хотя бы один пробел. Неизменяющийся текст может сливаться только с полями типа ON и никакими другими: main() { char ident[4]; char par[11]; par[0] = '\0'; strcpy(ident,"b514"); at 10,10; panel { Ваш идентификатор:# ON,ident,4# Введите пароль: # II,par,10# } } Вследствие вышеперечисленного следующие встроенные по¬ ля эквивалентны: char hello[13]; strcpy(hello,нЗдравствуйтем); #hello# # lhello# # lhello,12# 149
# l,hello,12$ # ON,hellot # ON,hello,12#, При этом последнисдве записи предпочтительнее. Приведем примеры болсе еложного использования встро¬ енных полей: # OH,"B H И M А H И E /"# # i+4,(J==2)? "Здравствуйте": ”Досвидания",т+(п/4)# Первый пример позволяет отобразить нсизменяющийся текст с повышенной яркостыо, второй - использует в качестве всех трех элементов переменные выражения. Встроенные конструкции at используются для изменения положения текста на экране. Приведем ее синтаксис: #@ строка,позиция_в_строке$ Поля строка и позищшветроке определяются целыми константами, целыми переменными или варажениями, выра¬ батывающими целые значения, языка Си. В результате работы следующего фрагмента программы at 1,10; panel { В H И M А H И E П О Л Ь 3 О В А T E Л Ь ! #@ 10,10$ P А Б О T А E T П А К E T : Q U I С К S С R E E N 1 } буква В будет номещена в 10-ю позицию 1-й строки; буква P будет помещена в 10-ю позицию 10-й строки; буква Q будет помещена в 10-ю позицию 11-й строки. Встроенная конструкция at задает начальные параметры, исходя из которых размещается последующий текст. Неко¬ торое неудобство представляет тот факт, что описания встроенных полей включаются в конструкцию panel. В следующем примере #@ 5,5# # ON,vvod,l# Введите вывранный номер меню буквы В и н будут находиться в одном столбце, хотя они зрительно разнесены в конструкции panel. Неудобство за¬ 150
ключается в том, что зачастую длина поля не соответст¬ вует длине его описания. Часто оказывается удобнее использовать явные, а не встроенные конструкции at. Следующие три фрагмента эк¬ вивалентны: at 5,1; panel { Равотает пакет panel { #0 5,I# Равотает пакет QUICKSCREEN QUICKSCREEN } У panel { #0 4,2# РаБотает пакет QUICKSCREEN } Если в программе не встречается ни явных, ни встроенных конструкций at, то в случае очистки экрана (см. п. 10.2.1) начальной точкой размещения текста считается 1-я позиция 1-й строки, а в случае сохранения предыдущего экрана - позиция конца информации предыду¬ щего экрана. Например, в результате работы программы: main() { panel { РаБотает пакет } panel { QUICKSCREEN } } первая конструкция panel считает 1-й символ 1-й строки исходной позицией. Вторая конструкция panel размещает текст исходя из последней позиции предыдущего экрана (т. e. Q будет находится в 1-й позиции 3-й строки). Команды в конструкции panel позволяют определить выполнение следующих функций: должна ли быть произведена предварительная очистка экрана или информация должна добавляться к содержимому предыдущего экрана; нужно ли выдавать звуковой сигнал; нужна ли блокировка клавиатуры терминала (в случае блокировки клавиатуры для возобновления работы с тер¬ миналом пользователь должен нажать клавишу СБРОС). По умолчанию предполагается очистка экрана (команда erase), звуковой сигнал не выдается (команда nobell), 151
клавиатура не блокируется (команда nolock). Если пользо¬ вателя не устраивают эти действия, необходимо задать команды noerase, bell, lock соответственно. Если какое-либо действие должно производиться только при выполнении определенного условия, используются сле¬ дующие формы команд: erase = выражение языка Си; bell = выражение языка Си; lock = выражение языка Си. В следующем примере panel(erase = ntrise <= 4, bell, lock) { } экран очищается только в случае, если переменная ntrise будет меньше или равна 4, будет выдан звуковой сигнал, и клавиатура заблокируется. Положение курсора на экране можно задать командой cursor = строка, позиция_в__строке где поля строка и позиция_в_строке представляют собой выражения языка Си. В случае отсутствия данной команды курсор помещается в начало того встроенного поля, в котором указано расположение курсора. Если и такое поле отсутствует, курсор помещается в первую позицию первой строки в случае очистки экрана и остается на месте, если экран не очищается. Для того чтобы понять остальные команды в конструкции panel, необходимо получить представление об этапах ее выполнения. Рассмотрим это на следующем примере: panel { Введите ваше имяг # lNC,name,15# У Вышеприведенная конструкция реализована как вызов 4 внутренних функций пакета QUICKSCREEN: QSBFINIT - инициализация экрана (стирание без выдачи звукового сигнала и без блокировки клавиатуры), обновле¬ ние признаков модификации данных. QSBUFFLD - вызов производится для каждого поля каждой 152
строки пакета, обеспечивает доступ к явным и встроенным полям конструкцииpanel. QSWRITE - вывод на терминал буфера, заполненного двумя предыдущими функциями. QSREAD - чтение ответа пользователя и передача его программе. Устанавливают переменные qskp, qsccol, qscrow (см. 10.3.3), содержимое измененных пользователем полей копируется в соответствующие переменные. Команды конструкции panel - init, write, read - опре¬ деляют, должны ли быть выполнены функции qswfinit, fswrite и qsread соответственно. По умолчанию они вы¬ полняются. Такие команды удобны при формировании одного экрана различными конструкциями paneL Они могут, напри¬ мер, встречаться в различных функциях, формирующих каждая свой участок экрана, что делает программу более структурной. В такой ситуации в первой конструкции panel должны указываться команды nowrite и noread, в последующих - noinit и nowrite, noread по усмотрению и в последней - noinit. Команда noinit, в отличие от noerase, не только инициализирует экран, но и позволяет избежать мерцания, что особенно важно при отображении графиков. Приведем пример конструкции panel с дополнительными командами: main() { char pole[28]; char parol[10]; i п t i ; zero(parol,10); strcpy(pole,''******* MOC ЕС ********"j; at 1,10; panel(nowrite,noread) { *** ВАС ПРИВЕТСТВУЕТ СИСТЕМА MOC ЕС ! *** } for (i=10;i<=15;++i) { panel(noinit,nowrite,noread) { # @ i , 10 # * * * * * * * * * * * * * * * * * * * * * * * * * * * > > at 12,10; panel(noinit,noread) { # OH,pole,27i У at 23,1; 153
panel(noinit) { Введите Ваш пароль: # INC,parol,10# } } Заметим, что не имеет смысла указывать вместе команды noinit и bell, так как в случае отсутствия инициализации не может быть и звукового сигнала. 10.2.3. Клавиши ввода данных Для ввода данных пользователь нажимает одну из клавиш идентификации внимания. Код этой клавиши помещается в переменную qskp, а текущие координаты положения курсора- в переменные qscrow и qsccol. В табл. 10.2 приводится перечень клавиш идентификации внимания и коды их значений. Значение переменной qskp можно проверять по имени клавиши или по коду ее значения. Имена клавиш, типы по¬ лей, переменные qskp, qscrow, qsccol, qsmod, qspos, qsfrow, qsfcol определены во включаемом файле с именем qsdefs.h. В работе с клавишами идентификации внимания следует учитывать: нажатие клавиши ПД1 вызывает сигнал прерывания, за¬ канчивающий работу программы. Для избежания последнего необходимо указать s ignal(SIGINT.SIG_YGN); либо signal(SIGINT.CATCH); Подробнее с обработкой сигналов можно познакомиться посредством команды: man signal нажатие клавиши ПД2 не вызывает передачи сигнала программе; нажатие клавиш ПД1, ПД2 или CTPH ЭКР не вызывает сохранения введенной пользователем информации в соот¬ ветствующих переменных; нажатие клавиш ПД1, ПД2, CTPH ЭКР и ВЫЗОВ ТЕСТА не вызывает установки переменныxqscrow и qsccol. 154
ч T а б л и ц а 10.2 г J— Имя | I Значение I ВВОД I (ENTER) | 0 ПФ1 (PF1) | 1 ПФ2 (PF2) | 2 ПФЗ (PF3) | 3 ПФ4 (PF4) | 4 ПФ5 (PF5) | 5 ПФ6 (PF6) | 6 ПФ7 (PF7) | 7 ПФ8 (PF8) | 8 ПФ9 (PF9) | 9 ПФ10 (PF10) | 10 ПФ11 (PF11) | 11 ПФ12 (PF12) | 12 ПД1 (PA1) | 25 ПД2 (PA2) | 26 CTPH ЭКР (CLEAR) j 28 выз.; TEC.(TEST REQ)| 29 L Другие | [ 100 I Для того чтобы определить, было ли поле модифи¬ цировано, можно использовать функцию qsmod(), аргументом которой является переменная этого поля. Функция возвра¬ щает 1, если поле с этой переменной было модифицировано, в противном случае 0. Функции qsfrow() и qsfcol() возвращают номер строки и позиции в строке начала поля, идентификатор которого указан в качестве аргумента этих функций. Эти функции удобно использовать для того, чтобы поместить курсор в поле, расположение которого на экране неизвестно. Команда wait конструкции panel определяет, должна ли функция qsread() ждать нажатия клавиши идентификации внимания пользователем (по умолчанию понимается ожида¬ ние). Следующий фрагмент программы wh i1e(... . ) { generate(); panel(noread) { } } 155
приведет к мельканию на экране картинок. Пользователь при этом не может остановить такой "фильм". Фрагмент программы: while (qskp!=PF3) { generate(); panel(nowait) { } } будет выполнять аналогичные функции, но пользователь мо¬ жет прекратить ее выполнение нажатием клавиши ПФЗ. Если картинка меняется слишком быстро, задержать сме¬ ну экранов можно командой sleep=expr, которая приведет к вызову функции sleep(expr) после выполнения функции qswrite() и до выполнения функции qsread(). Это более удобно, чем вызов функции sleep() после конструкции panel, так как пользователь в этом случае имеет время для нажатия клавиши, прежде чем выполнится чтение данных. Еще одна команда конструкции panel - alarm =expr аналогична предыдущей, за исключением того, что нажатие клавиши идентификации внимания приводит к немедленному возобновлению работы программы (независимо от истечения времени ожидания). При этом переменной qsalarm присваи¬ вается ненулевое значение, если программма возобновилась в результате истечения временного интервала, а не в результате нажатия клавиши. Как отмечалось ранее, нажатие клавиши ПД1 или ПД2 не приводит к сохранению информации в переменных, указанных во встроенных полях. Для того чтобы избежать данной ситуации, можно использовать, например, следующие проверки: panel { } while(qskp == PAl || qskp ==PA2) { panel(noerase,noresetmdt) { { } В этом примере программа не будет реагировать на нажатие клавиш ПД1 (PAl) или ПД2 (PA2). Данные, введен- 156
ные в поля, определяемые первой конструкцией panel, будут сохранены при нажатиии любой другой клавиши идентификации внимания (даже если перед этим были нажаты клавиши ПД1 или ПД2). Команда noresetmdt означает, что сброс признака модификации данных не должен произво¬ диться. Эта команда должна использоваться вместе с командой noerase, так как при очистке экрана содержимое полей теряется. 10.2.4. Операторы языка Си внутри конструкции panel Иногда при разработке Си-программ бывает удобно ис¬ пользовать операторы языка Си в текстовой части конст- рукциирапе1, как, например, вследующейпрограмме: main() { char data[9]; char tiptr; panel { #@ 1,10# ***-> ИНФОРМАЦИОННО-СПРАВОЧНАЯ СИСТЕМА <-*** #@ 5,10# Вы хотите путешествовать #@ 6,10# самолетом (с) или поездом (п): # IN,tiptr,l# с if (tiptr == 'с') { #@ 8,10# Введите день вылета (дд.мм.гг): # IN,data,8# с } с else if (tiptr == 'n') { #@ 8,10# Введите день от'езда (дд.мм.гг): # IN,data,8# с } с else { #@ 23,10# ///// ОТВЕЧАЙТЕ ВНИМАТЕЛЬНЕЙ ///// С } У У При этом строки текстовой части конструкции panel должны быть заключены в фигурные скобки. Операторы языка Си помечены буквой с в начале строки. В случае исполь¬ зования встроенных полей внутри оператора цикла для определения расположения поля на экране должна при¬ сутствовать встроенная конструкция at. 157
10.2.5. Трансляция и отладка программ, использующих пакет QUICKSCREEN Программа на языке Си, включающая конструкции пакета QUICKSCREEN, компилируется командой qs. Аргументами ко¬ манды qs служат имена файлов, содержащие подобные прог¬ раммы. Эти имена должны оканчиваться суффиксом .q. Препроцессор QUICKSCREEN, вызываемый по команде qs, заменяет конструкции пакета на обычные вызовы функций языка Си, и преобразованный таким образом текст помеща¬ ется в файл с соответствующим именем, полученным в результате замены суффикса .q на суффикс .c. Если в программе на этапе работы препроцессора QUICKSCREEN ошибок не обнаружено, вызывается Си-компи- лятор с теми же аргументами. При этом в именах файлов суффикс .q заменяется на суффикс .c. В конце списка аргументов добавляется -lq. Последний передается загруз¬ чику для подключения библиотеки /usr /lib/libq.a, где определены функции пакета QUICKSCREEN. Если для подавления загрузки используется флаг <, то в последующем, при вызове загрузчика, необходимо указать флаг -lq. В противном случае загрузчик выдаст сообщение о неопределенности некоторых имен, начинающихся с qs. Если компиляция выполняется без ошибок, созданные пре¬ процессором QUICKSCRENN промежуточные файлы уничтожа¬ ются. При задании флага -q команда qs заканчивает работу созданием файлов с суффиксом .c (вызов Си-компилятора не производится). Команда mqs по своему действию аналогична команде qs, но облегчает поиск ошибок. В файл, оканчивающийся на .q, вводятся сообщения об ошибках, которые помещаются после строк, в которых эти ошибки обнаружены. Сообщение об ошибке может встретиться и после оператора языка Си, что означает ошибку в одной из предыдущих конструкций panel, вовремя не обнаруженную препроцессором. Чаще всего подобная ситуация происходит вследствие использования недопустимого выражения во встроенном поле. В любом слу¬ чае ошибку следует искать в файле, имя которого содержит суффикс .q, а не .c. Более подробно познакомиться с действием и аргумента¬ ми команд qs и mqs можно по командам man qs и man mqs. Для отладки программ, использующих пакет QUICKSCREEN, можно использовать функциюprintf, учитывая следующее: 158
необходимо выполнить системный вызов: setbuf(stdout.null) (включив по #include предварительно файл stdio.h ); информация, выдаваемая на экран по функции printf, не может отображаться одновременно с текстом конструкции panel, так как дисплей может работать в каждый момент времени только в одном режиме - построчном или экранном. Если дисплей работает в экранном режиме, вывод функции printf накапливается в буфере длиной 1024 байта. Если следующая конструкция panel начинается с очистки экрана, выполнение программы прерывается. Буфер выводит¬ ся и внизу экрана появляется сообщение more... Программа находится в ожидании нажатия пользователем клавиши CTPH ЭКР (с1еаг).После нажатия клавиши CTPH ЭКР высвечивается текстовая часть конструкции panel и вы¬ полнение программы возобновляется. Если буфер, в котором накапливается вывод функции printf‘ переполняется, терминал зависает. В этом случае необходимо войти в систему с другого терминала, опре¬ делить идентификатор процесса - PID (используя команду ps) и затем прекратить выполнение зависшей программы выдав команду: kill -9 идентификатор процесса Как видно из вышесказанного, отладка Си-программ, включающих конструкции panel, несет в себе много неу¬ добств для пользователя. Обойти их можно двумя путями: перенаправить стандартный вывод в файл и проанали¬ зировать этот файл после завершения работы программы. В файле будет содержаться информация, выдаваемая функцией printf; после каждой конструкции panel поместить вызов функ¬ ции qsclose(), что вызывет функционирование программы в режиме полного экрана только в период выдачи текстовой части конструкции panel. В остальное время работа программы с терминалом будет проводиться в построчном режиме, т.е. вывод функции printf будет отображаться на экране непосредственно по мере прохождения этой функции в программе. Если этот вывод занимает меньше строк, чем длина экрана, то сообщение more... не появляется и текстовая часть следующей конструкции panel высвечи¬ вается на экране сразу же. В этом случае у пользователя нет времени разглядеть и проанализировать содержимое 159
предыдущего экрана. Чтобы избежать этого, надо помещать перед каждой конструкцией panel либо n символов перевода строки (где n - число строк экрана минус 1), либо команду^ф. После того как программа будет отлажена, не забудьте удалить все вызовы функции printf и qsclose. 10.3. Использование пакета QUICKSCREEN в программах, разработанных на языках высокого уровня Как отмечалось ранее, конструкции пакета QUICKSCREEN могут быть использованы только внутри программ, разра¬ ботанных на языке Си. Однако в программах, разработанных на языках высокого уровня (Фортран 77, Паскаль), так же часто возникает необходимость организации диалога в режиме полного экрана. Для обеспечения такой возможности пользователь может разрабатывать текст самой программы на языке высокого уровня, а диалоговую часть - на языке Си и оформить ее как внешнюю процедуру или подпрограмму. При этом данные, предназначенные для вывода на экран терминала, передаются в диалоговую часть программы либо как параметры, либо через логический экран. Логический экран представляет собой обычный файл на диске определенных размеров (рис. 10.1). С логическим экраном программа работает стандартными средствами ввода-вывода (операторы read, write). При этом данные типа integer и real автоматически преобразу¬ ются в тип character и в файле логического экрана они уже находятся в символьном виде. Модулю организации диалога остается только отобразить информацию, находящу¬ юся в файле логического экрана, на экран терминала. Пользователь может разработать стандартные модули ввода-вывода в режиме полного экрана между экраном терминала и логическим экраном. В этом случае при вызове модулей ввода-вывода (оформленных в головной программе как внешние процедура или функция) на вход им (в качестве параметров) передаются: имя соответствующего файла логического экрана; два целых числа, определяющих количество строк в логическом экране и их длину. Приведем пример программы на языке Паскаль, обращаю¬ щейся к стандартным модулям (readd и writed) организации диалога в режиме полного экрана: 160
Стандартный ввод Программный модуль Стандартный read вывод 1 write Логический Логический экран экран ввода вывода readd writed Tерминал Рис. 10.1. Организация диалога через логический экран program KOREN(korenw,korenr); TYPE dialog = TEXT; WAR Strokaz PACKEDARRAY[1..23] OF CHAR; nameflw,nameflrz PACKED ARRAY [1..6] OF CHAR; korenr,korenwz dialog; a,b,cz REAL; str,dlstr,ksiz INTEGER; PROCEDURE readd(VAR filelz packed array[1..6] of cha ml,m2,m3z integer); EXTERN; PROCEDURE writed(VAR file2z packed array[ 1 • .6] of char; ml,m2,m3z integer); EXTERN; BEGIN (* Формирование логического экрана *) rewrite(korenw,'korenw'); 161 6 Заказ № 1154
writeln(korenw,'BBe<4HTe коэффициент а : ';; writeln(korenw,'BBeAHre коэффициент b : ')} writeln(korenw,'BBeAHre коэффициент с : '); reset(korenw); (* Вывод информ. с логического экр. на экр. терминала *) nameflw := 'korenW; str := 3; dlstr := 2S; fcsi := 6; writed(nameflw,ksi,str,dlstr); (* Ввод информ. с экр. терминала в логический экран *) nameflr := 'Acorenr'; readd(nameflr,ksi,str,dlstr); (* Ввод с логического экрана *) reset(korenr,'korenr'); readln(korenr,stroka,a); readln(korenr,stroka,b); readln(korenr,stroka,c); (* Проверка вводимых данных *) END. В данном примере модули ввода-вывода оформлены как внешние процедуры rea<W и writed. Логические экраны представляют собой файлы с именами korenw и korenr. Объем вводимой и выводимой информации равен трем строкам, каждая из которых имеет длину по 28 символов. Если пользователь организует передачу информации между головным модулем и модулями ввода-вывода не посредством логического экрана, а через параметры, он сам должен осуществлять преобразование данных из типа integer и real в тип character, что значительно усложнит его работу. К тому же он будет вынужден передавать дополнительную информацию, определяющую расположение данных на экране терминала. Совместная трансляция и редактирование головных мо¬ дулей на языке высокого уровня и модулей ввода-вывода на языке Си, включающих конструкции panel, осуществляется: на уровне исходных текстов - для программ, разрабо¬ танных на языке Фортран 77 f77 koren.f readd.c writed.c -lq 162
При этом модули ввода-вывода предварительно преобразуют¬ ся операторами qs -q readd.q qs -q writed.q из вида, содержащего конструкции пакета QUICKSCREEN, в вид, содержащий вызов соответствующих Си-функций пакета (файлы из вида .q преобразуются в вид .c); на уровне объектных кодов - для программ, разрабо¬ танных на языке Паскаль. pc koren.p readd.o writed.o -lq При этом модули ввода-вывода предварительно преобразуют¬ ся операторами qs -с readd.q qs -c writed.q из вида, содержащего конструкции пакета QUICKSCREEN, в объектные коды. Пользователь не должен забывать о включении флага -lq в операторы f77 и pc для подключения библиотеки /usr/lib/libq, а на этапе редактирования. В противном случае будет выдано сообщение о неопределенности некото¬ рых имен, начинающихся с qs. 10.4. Организация экранного режима работы без использования пакета QUICKSCREEN Как видно из вышеизложенного материала, пакет QUICKSCREEN - довольно удобное средство для разработки интерактивных программ, поддерживающих диалог в режиме полного экрана. Средства пакета значительно поднимают уровень работы пользователя, повышают эффективность его труда, делают программу более наглядной. Однако пакет QUICKSCREEN имеет и недостатки, которые выражаются в следующем: пакет не позволяет организовать диалог в режиме поли¬ экранной обработки; пакет не обеспечивает реализации всех функций терминала ЕС 7927 (не реализованы функции управления световым пером); 6* 163
пакет накладывает ограничения на количество полей ввода-вывода, находящихся на одной строке экрана терми¬ нала. Если пользователю необходимо выполнить действия, реализация которых не обеспечивается пакетом QUICKSCRENN в силу перечисленных выше недостатков, он имеет возмож¬ ность организовать диалог в режиме полного экрана и без использования средств пакета. Для этого ему необходимо перераспределить стандартные ввод-вывод программы с фай¬ ла ttyXXX на файл tubXXX, где XXX - логический адрес терминала, за которым работает пользователь, либо опре¬ делить файл tubXXX, который распределен на управляющий терминал, и осуществлять ввод-вывод операторами read и write с указанием его имени. Для определения файла tubXXX пользователю необходимо: определить в программе системную функцию ttyname() как функцию, возвращающую ссылку на символьную сгроку: char *ttyname(); и указатель *p, которому будет присвоено значение этой ссылки: char *p; вызвать функцию ttyname() с параметром 0 или 1, который представляет собой дескриптор стандартного файла ввода или вывода соответственно: p = ttyname(1); В результате выполнения функции ttyname() переменная p будет содержать адрес символьной строки вида: /dev/ttyXXX заменить в символьной строке /dev/ttyXXX символы tty на tub соответственно: p[5] = 't'; p[6] = 'u'; p[7] = 'b'; В результате выполнения этих действий указатель *p будет содержать ссылку на символьную строку с полным именем "прозрачного” терминального файла, распределен¬ ного при запуске MOC на управляющий терминал пользова¬ теля. Дальнейшая работа по организации ввода-вывода в 164
программе сводится к управлению экраном и перекодировке информации. Необходимость перекодировки объясняется тем, что внутренним кодом MOC ЕС является код ASC П, а дисп¬ лейных комплексов EC7920 - код ДКОИ. Драйверы файлов ttyXXX выполняют эту перекодировку автоматически при обмене данными между буферами драйвера и терминалом. Если же пользователь организует диалог через "проз¬ рачный" терминальный файл без использования пакета QUICKSCREEN, перекодировку он должен выполнить самос¬ тоятельно. Таблицы перекодировки ASC П-ДКОИ и ДКОИ-ASC II на¬ ходятся в ядре MOC ЕС. Для организации доступа к ним пользователю необходимо зарезервировать по 256 байт для каждой таблицы: char tubitab[256]; char tubotab[256]; и описать структуру вида: struct { char *itable; char *otable; struct xlate *itable; struct xlate *otable; } table Далее в элементы *itable и *otable структуры table заносятся адреса выделенных областей для таблиц переко¬ дировок: table.itable = &tubitab; table.otable = &tubotab; Выполняя системный вызов ioctl(qsfsfd,TIOCGETT,&table); где qsfsfd- дескриптор открытого файла /dev/tubXXX, пользователь заполняет выделенные области для таблиц перекодировок информацией из ядра MOC ЕС. 165
В структуре table содержится структура xlate, имеющая вид: struct xlate { char cl; char c2; char outchar; } Данная структура предназначена для перевода специальных символов, используемых в MOC ЕС ( {,}, | и тд*.), в эк¬ вивалентную замену с помощью двойных символов на клавиатуре дисплея ( (<,>),\\ и т.д.). Причем в програм¬ ме выделяется массив из двадцати структур xlate для перекодировки специальных символов MOC ЕС в двойные символы клавиатуры дисплея: struct xlate idbl_tab[20]; и массив из двадцати структур xlate для обратной пере¬ кодировки: struct xlate odbl_tab[20]; Последними элементами массивов является структура xlate, состоящая из одних нулей. Адреса первых элементов массивов структуры xlate запоминаются в элементах структуры table: table.idbltab = idbl_tab; table.odbltab = odbl_tab; Системный вызов ioct1(qsfsfd,TIOCGETT,&table); заполняет выделенные массивы структур исходной инфор¬ мацией для перевода символов. После того как таблицы перекодировок полностью за¬ полнены, пользователь может приступить непосредственно к форматизации экрана терминала. В буфер, предназначенный для вывода, он записывает символ управления записью (СУЗ) - 0x24, устанавливает адрес буфера £УАБ)- 0x11 и далее адрес на экране, терминала, указывает символ начала поля (НП) - 0x1d и т.д., т.е. стандартными средствами дисплейных комплексов EC7920 [5] осуществляет управ- 166
ление экраном терминала. Непосредственно для организации чтения или записи информации пользователю необходимо установить соответствующую команду чтения или записи посредством системного вызова ioctl. Так, системный вызов ioct1(qsfsfd,TUBOCMD,0x05); устанавливает команду ’’стирание-запись", а вызов ioct1(qsfsfd,TUBICMD,0x02); устанавливает команду "считывание буфера". Ниже приводится текст программы на языке Си, демон¬ стрирующий пример организации диалога в режиме полного экрана (вывод информации на экран терминала) без использования пакета QUICKSCREEN: #include <sgtty.h> main( ) { struct xlate { char cl; char c2; char outchar; } idbl_tab[20]; struct xlate odbl_tab[20]; char tubitab[256],tubotab[256]; int qsfsfd,i; char *ttyname(); char pole[256],*p,*qstiop; char *start,*s; char vnkod[44]; struct { char *itable; char *otable; struct xlate *idbltab; struct xlate *odbltab; } table; table.itable = &tubitab[0]; table.otable = &tubotab[0]; table.idbltab = idbl_tab; table.odbltab = odbl tab;
p s= ttyname( 1) ; /* получить полное имя системного файла */ p[5] = 't'; /* замена */ p[6] = 'u'; /* ttyXXX */ p[7] = '5';/* на tubXXX */ if ((qsfsfd = open(p, 2)) < 0) priПtf("ОШИБКА ПРИ ОТКРЫТИИ ФАЙЛА !\п”)} ioct1(qsfsfd,TIOCGETT,&table); /* заполнение тавлиц перекодировки */ qstiop = poie; *qstiop++ = 0x24 *qstiop++ =0x11 *qstiop++ = 0x4c *qstiop++ = 0x2e *qstiop++ = 0x1d *qstiop++ = 0x20 *qstiop++ = 0x13 /* СУЗ */ /* УАБ */ /* адрес */ /* на экране */ /* начало поля */ /* символ атривут */ /* установить курсор */ Strncpy(vnkod," ПРИМЕР РАБОТЫ С ПОЛНЫМ ЭКРАНОМ ТЕРМИНАЛА '',44); start = vnkod; s = start + 44; while (start <= s> { *start = tubotab[*start]; start++; } strncpy(&pole[10],vnkod, 44); ioct i(qsfsfd,TUBOCMD,0x05); /* установить ком. запись со стиранием */ write(qsfsfd,pole,180); } Глава 11. СИСТЕМАУПРАВЛЕНИЯ РЕЛЯЦИОННЫМИ БАЗАМИ ДАННЫХ INGRES Система управления реляционными базами данных (СУРБД) E4GRES является одной из первых отечественных систем, реализованных в среде мобильной операционной системы MOC ЕС. СУРБД INGRES поддерживает реляционную модель данных. 168
В соответствии с реляционным подходом база данных (БД) представляет собой поименованную совокупность двумерных таблиц, называемых отношениями. Каждое отношение в БД имеет уникальное имя и содержит множество строк. Столбцы отношения называются атрибутами, каждый из которых дол¬ жен иметь уникальное имя в рамках отношения. Элемент отношения, находящийся на пересечении строки и столбца, всеща содержит скалярное значение и называется значе¬ нием атрибута. Множество всех допустимь1Х значений дан¬ ного атрибута в данном отношении называется доменом атрибута. При определении отношения указывается его имя и имена всех его атрибутов (рис. 11.1). Совокупность имени отношения и имен его атрибутов называется схемой отношения. Совокупность имени БД и схем отношений, созданных в рамках этой базы данных, называется схемой БД. При определении схемы отношения для каждого атрибута указывается соответствующий ему домен. Домены в СУРБД INGRES задаются форматами данных, которым должны удовлетворять значения соответствующих атрибутов. Помимо этого для каждого атрибута можно задавать ограничения целостности, которое определяет его область допустимых значений. СУРБД INGRES не накладывает практически никаких ограничений на число поддерживаемых ею баз данных, количество отношений в БД и число строк в каждом отноше¬ нии. Однако следует иметь в виду, что любое отношение может содержать не более 49 атрибутов, а значение атрибута не может превышать 255 символов. Для именования баз данных, отношений и атрибутов в СУРБД INGRES приняты следующие соглашения: а) имя - это последовательность прописных букв и цифр, содержащая не более 12 знаков и начинающаяся с буквы, знак подчеркивания (-) считается буквой; б) в имени базы данных допускается использование только латинских букв; в) в именах отношений и атрибутов допускается использование как латинских, так и русских букв. В целях повышения эффективности доступа к данным и использования внешней памяти СУРБД INGRES позволяет обеспечить различную стратегию физической организации отношений: isam - индексно-последовательная структура хране¬ ния; cisam - сжатая isam; hash - хэшированная структура хранения; 169
chash - сжатая hash; heap - неключевое неструктурированное хранение ("вал"); cheap - сжатая heap; heapsort - heap с сортировкой строк и устранением дублирующих строк; cheapsort - сжатая heapsort; trancated - heap с удалением всех строк. По умолчанию принимается неключевое неструкту¬ рированное хранение данных (heap организация или просто "вал”). В СУРБД INGRES реализован язык QUEL (от QUEry Language - язык запросов), который в сочетании со средствами, предоставляемыми MOC ЕС, обеспечивает эффек¬ тивный доступ к базам данных как для пользователей, работающих за терминалами в интерактивном режиме, так и для прикладных программ, написанных на языке Си. Язык QUEL легок в изучении и использовании, особенно удобен для пользователей, не являющихся профессиональны¬ ми программистами. В нем предусмотрена возможность опе¬ рирования не только хранимыми, но и виртуальными отноше¬ ниями. Такая возможность, а также наличие удобных меха¬ низмов авторизации доступа позволяет предоставить каждо¬ му пользователю как бы его индивидуальную подсхему базы данных. Рассмотрим основные возможности, предоставляемые СУРБД INGRES в интерактивном режиме. Для создания базы данных используется команда MOC ЕС creatdb, которая имеет следующий вид: creatdb [-иимя] [+-с] [+-q] имя__Базы__данных Пользователь, создающий базу данных по команде creatdb, становится ее администратором. По отношению к своей базе данных администратор обладает всем перечнем полномочий, которые предоставляет система и которые могут быть недоступны обычным пользователям этой базы данных. Имя базы данных должно быть уникальным, т.е. в системе не может существовать двух баз данных с одинаковыми именами. База данных может создаваться как в каталоге СУРБД INGRES (имя каталога /ingres/data/base), так и в личном каталоге пользователя. В том случае, если база данных создается не администратором СУРБД INGRES, необходимо 170
otdel - имя вазы данных | имя отношения сотрудник Ф И О Началь¬ Г ОД Долж¬ Сте¬ Оклад ник рождения ность пень i '. i i i I I а т p и Б У т ы fe= отношения | имя отношения должность ИМЯ Махоклад Min оклад Степень Количес¬ тве э и м e н а а т p и Б у 1 R о в Рис. 11.1. Фрагмент схемы вазы данных otdel
использовать флаг -w, за которым без пробелов следует идентификатор пользователя системы MOC ЕС. Этот пользователь должен быть помечен администратором СУРБД INGRES в регистрационном файле пользователей системы (/ingres/ files/users) как имеющий полномочия привиле¬ гированного пользователя. При создании базы данных в каталоге системы достаточ¬ но выполнить команду creatdb с указанием при необходи¬ мости флагов и имени базы данных: Пример 11.1. -ГОТОВО-> creatdb otdel -ГОТОВО-> В том случае, если пользователь желает создать базу данных в отдельном каталоге, предварительно необходимо в каталоге /ingres / data /base системы INGRES создать файл, имя которого должно совпадать с именем создаваемой базы данных. В этот файл следует записать полное имя каталога, в котором будет размещаться база данных. Это можно сделать с помощью редакторов ned или ed или коман¬ ды cat. Сам каталог к моменту выполнения команды creatdb не должен существовать, так как система INGRES создает его сама. Файл, в котором хранится имя каталога, должен иметь полномочия 600 (см. гл. 3). Пример 11.2. -готово-> cat>/ingres/data/base/otdel /mntsys/uwc/b513/otd [нажмите клавишу ВЫЗОВ ТЕСТА] -ГОТОВО-> chmod 600 /ingres/data/base -ГОТОВО-> creatdb otdel -ГОТОВО-> В данном примере показано создание базы данных с именем zovod в каталоге с именем /mntsys/uwc/a513/otd. Отметим, что создание базы данных в отдельном ката¬ логе имеет определенное преимущество. Оно связано с тем, что при разрушении каталога системы INGRES восстановить базу данных не составит труда. Достаточно будет вновь 172
создать в восстановленном каталоге /ingres/data/ base файл с именем базы данных и записать в него имя ее каталога. Флаги команды creatdb определяют режимы использования базы данных. Если флагу предшествует префикс +, то соответствующий режим должен быть включен, а если -, то режим должен быть выключен. Флаг -с устанавливает однопользовательский режим использования базы данных, а флаг +c - многопользова¬ тельский доступ к базе данных. По умолчанию устанавли¬ вается многопользовательский режим использования базы данных. Флаг -q отключает средства модификации запросов к базе данных (по умолчанию эти средства включаются). Средства модификации запросов позволяют использовать аппарат виртуальных отношений, защиты данных от несанк¬ ционированного доступа и обеспечения целостности отноше¬ ний. При отключенных средствах модификации запроса все отношения базы данных доступны всем пользователям для любых операций над ними. Отметим, что модификация запро¬ са связана с включением в запрос операторов проверки полномочий на доступ, целостности отношений, а также работы с виртуальными отношениями, которые формируются из реальных отношений. Для задания полномочий, ограниче¬ ний целостности и определения виртуальных отношений в системе существуют специальные операторы, которые будут рассмотрены ниже. Создание базы данных по команде creatdb заключается в формировании шести системных отношений, в которых хранится схема базы данных: relation - для хранения данных об отношениях базы данных, в том числе и системных отношениях; attribute - для хранения сведений об атрибутах отношения, в том числе и атрибутах системных отношений; indexes - для хранения сведений о вторичных индексах отношений, имеющих индексно-последовательную структуру хранения; tree - для хранения сведений о виртуальных отношениях; protect - для хранения данных о полномочиях по доступу к отношениям базы данных; integrities - для хранения данных об ограничениях целостности, накладываемых на отношения. Для системы INGRES эти отношения ничем не отличаются от отношений, создаваемых пользователем (пользователь¬ ских отношений). Системными отношениями пользователь может оперировать аналогично его собственным отношениям 173
с помощью языка QUEL, однако не пытайтесь модифицировать их. Для пользователя прежде всего представляет интерес системное отношение с именем attribute, в котором, по существу, хранится полная схема базы данных, включая как системные, так и пользовательские отношения. Для просмотра содержимого любого отношения базы данных можно использовать команду монитора shell следующего вида: printr [флаги] имя_вазы_данных имя^отношения Пример 11.3. -готово-> printr otdel attribute attribute relation attrelid | own j \attid\attname \ I I L off|frm|f I I rm|xtr| i i relation 1 | ad 1 I г | 1 j relid | I i 0\с | J2| 0 | relation | ad | 13\relstamp \ 40 | i | 4| 01 integrities \ ad | 1|intrelid \ 0 |c | 12 I 0 | integrities|ad | 8|intresvar\ j | L 32 | i | I L_ 1 I 1 0 | -ГОТОВО-> Команда printr работает аналогично команде cat, что при большом числе атрибутов у отношения не позволяет в диалоге просмотреть все отношение. Поэтому рекомендуем команду printr использовать совместно с командой ned (экранный редактор текстов, см. гл. 2), объединяя их посредством конвейера printr юия_базы_данньос има_отношениа | ned Для просмотра схемы базы данных можно воспользоваться командой монитора helpr, имеющей следующий вид: helpr имя_Базы__данных [имя__отношения] Если указывается только имя базы данных, то команда выдает перечень отношений базы данных, в противном случае выдается схема указанного отношения. 174
Пример 11.4. -ГОТОВО-> helpr otdel relation name relation owner (имя отношения) (владелец отношения) relation ingres attribute ingres indexes ingres tree ingres protect ingres integrities ingres -ГОТОВО-> helpr zavod attibute Relation(Oтнoшeниe): Онпег(Владелец): Tuple width(OБщaя длина): Number of tuples(чиcлo строк): Storage structure(CTpyKTypa хранения) Relation type(Tnn отношения): attribute name type (имя атривута) (тип) attribute ingres 33 66 \paged heap system catalog length keyno. (длина)(ключ) attrelid с 12 attowner с 2 attid i 2 attname с 12 attoff i 2 attfrmt с 1 attfrml i 1 attxtra -готово-> i 1 С помощью команды creatdb можно изменять также режим использования ранее созданной базы данных. В этом случае оператор creatdb имеет вид: creatdb [-иимя] -e [+-с] [+g] имя_вазы_данных В данном случае флаг -e указывает на то, что изменяется режим использования уже существующей базы данных. Так можно устанавливать как однопользовательский (-c), так и режим коллективного доступа к базе данных. Следует помнить, что средства коллективного доступа можно отключать только тогда, когда заранее известно, что в любой момент времени будет работать лишь один пользователь. Эти средства должны быть включены, даже если пользователи не имеют общих отношений в базе 175
данных, т.е. когда с каждым ее отношением работает не более одного пользователя. Однако и в этом случае осуществляется коллективный доступ к схеме базы данных, хранящейся в системных таблицах. Если для ранее созданной базы данных не был установ¬ лен режим модификации запросов, то его можно установить посредством флага +q. Отключить режим модификации запро¬ сов, если он был установлен, нельзя. Если режим моди¬ фикации запросов устанавливается для базы данных, ранее функционирующей без него, то новые отношения будут создаваться доступными только владельцу базы данных, но ранее созданные отношения (до установления режима моди¬ фикации) останутся доступными для всех пользователей и для любых операций. Переопределить полномочия по доступу к отношению можно с помощью операторов distroy и defme permit языка QUEL, которые будут рассмотрены ниже. В том случае, если команда на переопределение режимов использования базы данных выполняется не ее адми¬ нистратором, то необходимо использовать флаг -и. Для уничтожения ранее созданной базы данных использу¬ ется команда монитора sheU следующего вида: destroydb [-s] [-m] имя__вазы__данных По этой команде система удалит каталог указанной базы данных и все файлы этого каталога. Удаляются также все ссылки на эту базу данных. Команду имеют право выполнить только администратор этой базы данных или привеле- гированный пользователь, но с обязательным указанием флага -s. Если задан флаг -m, то удаляются только файлы каталога базы данных, а сам каталог сохраняется. После того как пользователь создал базу данных, он может приступить к формированию ее схемы и внесению в нее данных. В интерактивном режиме работа пользователя с базой данных ведется посредством монитора интерактивного режима СУРБД INGRES. Для входа в монитор интерактивного режима пользователю достаточно выполнить команду вида ingres [флаги] имя__Базы_данных Пример 11.5. -ГОТОВО -> ingres otdel go :к 176
Сообщение go в данном примере означает, что монитор готов к работе, а символ * (звездочка) - приглашение вводить запрос. Команда ingres является обычной командой монитора shell, имеющей стандартные ввод и вывод. Таким образом пользователь может подготовить запрос на языке QUEL в отдельном файле и переадресовать его на вход команды ingres. Аналогичным образом, переадресовав стандартный вывод, можно сохранцть результат работы команды ingres в некотором файле. Например, используя команду монитора tee (см.гл. 4), можно сохранить протокол работы пользо¬ вателя в интерактивном режиме с базой данных в отдельном файле: ingres otdel\tee protokol Для создания схемы отношения базы данных используется оператор create языка QUEL следующего вида: create имя__отношения ( имя_атривута=формат [,имя__атривута-формат] ...) В поле формат оператора create дается описание домена атрибута, который может принимать следующие значения: а) cl-c255 - символьные данные длиной от одного до 255 байт; б) il - однобайтовое целое число (от -128 до 127); в) i2 - двухбайтовое целое число (от- 32768 до 32767); г) i4 - четырехбайтовое целое число (от - 2147483648 до 2147483647); д) f4 - четырехбайтовое число с плавающей точкой (от - (10**38) до 10**38, точность - 7 десятичныхзнаков); е) f8 - восьмибайтовое число с плавающей точкой (от - (10**38) до 10**38, точность -17 десятичныхзнаков. Для выполнения операторов языка QUEL в интерактивном режиме их необходимо прежде всего набрать в поле команды монитора и путем нажатия клавиши ВВОД занести в буфер монитора. Для выполнения оператора, находящегося в буфе¬ ре монитора, необходимо ввести команду вида \g. Пример 11.6. * create сотрудник (фио=с20,начальник=с20, год__рождения= i 2, должность=с 15, степень=с4, оклад-12) 7 Заказ № 1154 177
* create должность (имя=с15, тах__оклад=12, т1П__оклад=12, степень=с4, количество-12) * \д Executing continue * Сообщение Executing говорит о том, что началось выполнение запроса, а сообщение continue - о том, что запрос выполнен. В данном примере в базе данных otdel были созданы два отношения, а именно,- сотрудник и должность (см. рис. 10.1). Отношение сотрудник создается для хранения следующих данных о сотруднике: фамилия, имя, отчество - атрибут фио\ фамилия, имя, отчество начальника сотрудника атрибут начальник; год рождения сотрудника - атрибут годрождения; занимаемая должность сотрудника - атрибут долж¬ ность; должностной оклад сотрудника - атрибут оклад; ученаястепеньсотрудника - атрибут степень. Отношение должность предназначено для хранения следу¬ ющих сведений о должностях: наименованиедолжности - атрибуты^шг; максимальный оклад для занимаемой должности - атри¬ бут тах_оклад\ минимальный оклад для занимаемой должности - атри¬ бут тт_оклад\ ученая степень, которую необходимр иметь для заня¬ тия должности - атрибут степень; количество данных должностей в отделе - атрибут ко¬ личество. Для того чтобы убедиться в создании отношения, можно воспользоваться командой help, которая аналогична коман¬ де helpr монитора shell. Пример 11.7. * help сотрудник * \д Executing Relatiom сотрудник 178
ш Owner: Tuple width a513 63 Saved until: Number of tuples Ued Oct 25 06:00:00 1989 0 Storage structure Relation type: paged heap user relation attribute name type length keyno фИО начальник год_рождения должность степень оклад continue с с i с с i 20 20 2 15 4 2 После того как создана схема отношения, пользователь может определить физическую структуру хранения отноше¬ ния, задать ограничения целостности и определить права доступа к отношению. По умолчанию вновь созданное отношение имеет heap организацию ("вал"). Такая структура при больших объемах , данных имеет два недостатка: * допускает наличие дублирующих строк в отношениях; большое время доступа к данным. Пользователь вправе в любой момент времени изменить физическую организацию хранения любого доступного ему отношения. Для модификации физической организации служит опера¬ тор modify, который в простейшем случае имеет вид: modify имя_отношения to структура___хранения [ on ключ1 [: порядок ] [ключ2 [: порядок> ] •••]] Поле структура хранения может принимать следующие значения: isam, cisam, hash, heap, cheap, heapsort, cheapsort и trancated. Пример 11.8. Следует модифицировать структуру хране¬ ния отношения сотрудник в индексно-последовательную (isam) с атрибутом фио в качестве ключа: 179
* modify сотрудник to isam on срио * \g * Заметим, что команды монитора интерактивного режима можно записывать в одной строке с операторами языка QUEL, разделяя их пробелом. Пример 11.9. Необходимо модифицировать структуру хра¬ нения отношения должность в хешированную сжатую (shash) с ключевыми атрибутами имя и тах_оклад: * modify должность to chash on имя, тах_оклад \д ★ При модификации структуры хранения отношений в струк¬ туру heapsort или cheapsort операнд порядок может задавать для каждого атрибута сортировку по возрастанию {ascending или просто a) или по убыванию {descending или просто d). По умолчанию всегда выполняется сортировка по возрастанию значений атрибута. Пример 11.10. Следует модифицировать структуру хране¬ ния отношения сотрудник в heapsort с сортировкой по зна¬ чениям атрибута оклад: * modify сотрудник to heapsort on оклад: ascending \g * или просто: * modify сотрудник to heapsort on оклад \д * Пример 11.11. Модифицировать структуру хранения отно¬ шения должность в cheapsort с сортировкой по возрас¬ танию значений атрибута minj)Khad и убыванию значений атрибута max_OKjiad: ** modify должность to cheapsort on min__oклaд:a, max оклад:d 180
* \g ★ ИЛИ * modify должность to cheapsort op т1г\_оклад, тах^оклад*^ * \g * Отметим особенность структуры хранения trancated (неключевое неструктурированное хранение с удалением всех строк). При выполнении оператора modify с указанием структуры хранения trancated для отношения устанавли¬ вается структура хранения heap (неструктурированное неключевое хранение) и удаляются все строки отношения, т.е. в базе данных остается только схема отношения. Дан¬ ную структуру оператора modify удобно использовать для очистки отношения. В целях повышения достоверности данных, вносимых в базу данных, на атрибуты отношения могут накладываться ограничения целостности. Следует помнить, что ограниче¬ ния целостности, так же как и права по доступу к отношению, могут устанавливаться только в том случае, если установлен режим модификации запросов для базы данных (см. оператор creatdb). Под ограничением целостности отношения понимаются правила, которым должны удовлетворять любые модификации строк этого отношения и вновь вводимые строки. Эти пра¬ вила задают множества допустимых значений атрибутов и (или) взаимовлияние значений атрибутов в рамках одного отношения. Ограничения целостности вводятся оператором вида define integrity on ранговая^переменная is условие Ранговая переменная определяется на некотором отноше¬ нии путем выполнения оператора шл#е, имеющего следующий вид: range of ранговая___переменная is имя_отношения Значениями ранговой переменной являются строки опре¬ деленного на ней отношения. Отметим, что на одном и том 181
же отношении могут быть определены одновременно несколь¬ ко ранговых переменных. По существу ранговая переменная является временным именем отношения. Определив на одном отношении две ранговые переменные, можно работать как бы с двумя отношениями, имеющими одну и ту же схему. Условие задает описание некоторого поискового кри¬ терия. В языке QUEL условие состоит из произвольного числа атомов, соединяемых логическими операторами not (логическое "не" - отрицание), and (логическое "и" конъюнкция) или or (логическое "или" - дизъюнкция). Атом представляет собой два выражения, соединенных операторами сравнения: выражение^! оператор^сравнения выражение__2 В качестве операторов сравнения в СУРБД INGRES могут использоваться: < - меньше, чем; < = - меньше или равно; > - больше, чем; > = - больше или равно; = -равно; | = - не равно. Заметим, что при необходимости группирования атомов можно использовать скобки. Выражение 1 для данного опе¬ ратора задает атрибут отношения, на который накладывает¬ ся ограничение, и формируется из ранговой переменной, за которой через точку следует имя атрибута. Выражение 2 может задаваться аналогично выражению 1, а также в виде константы или арифметического выражения. Более подробно виды выражений будут рассмотрены ниже. Пример 11.12. Оклад сотрудника не может быть меньше 70 рублей и больше 450 рублей: * range of а is сотрудник * define integrity on а is а.оклад>=70 and а.оклад<=450 * \д Executing continue * Пример 11.13. Определить на отношении должность огра¬ ничение целостности, указывающее, что максимальный должностной оклад не может быть меньше минимального должностного оклада: 182
* range of a is должность * define integrity on a is а.тах__оклад >= а.т]п__оклад * \g * Для того чтобы убедиться, что ограничения целостности для отношения установлены, достаточно выполнить команду help следующего вида: help integrity имя^отношение f.*. имя^отношения] Если на отношении определены ограничения целостности, то любые модификации отношения (добавление новых строк или модификация отдельных значений атрибутов в строке) будут проведены только в том случае, если они удовлет¬ воряют введенным ограничениям. При этом необходимо помнить, что если модификация отношения не проводится в силу ее несоответствия ограничениям целостности, то никакого сообщения пользователю система не выдает. При использовании оператора define необходимо учиты¬ вать, что в момент его выполнения должно быть объявлено не более одной ранговой переменной. Рекомендуется уста¬ навливать ограничения целостности сразу после входа в диалоговый монитор системы, переопределяя одну и ту же ранговую переменную для различных отношений. Как уже отмечалось, пользователь может установить полномочия по доступу к созданному им отношению для других пользователей базы данных. Полномочия на доступ к отношению определяют, какие операторы языка QUEL к каким атрибутам отношения и их значениям и при каких условиях пользователь может применить к этому отношению. Для за¬ дания полномочий используется оператор define следующего вида: define permit cnncoK_onepaTopoB_QUEL to ранговая^переменная [(список^атривутов)] to идентификатор^пользователя [at терминал] . [from время to время] [on день to день] [where условие] Оператор define permit устанавливает полномочия по доступу к отношению, определяемому ранговой переменной. Список операторов QUEL представляет собой перечень разделенных запятыми имен опеоаторов, которые разрешает- 183
ся выполнять, или ключевое слово all (все). В качестве имен операторов могут выступать следующие имена: retrieve - найти и прочитать; replace - изменить; delete - уничтожить; append - добавить. Если в качестве списка указано ключевое слово a//, то полномочия предоставляются в полном объеме. Важно отме¬ тить, что указание всех допустимых операторов языка QUEL не эквивалентно заданию ключевого слова all. В первом случае пользователю разрешается выполнять над отношением лишь те операторы, которые указаны в списке. Во втором случае он может выполнять над отношением любые операторы языка QUEL (например, тот же оператор define permit). В качестве идентификатора пользователя, для которого устанавливаются полномочия, может указываться либо идентификатор, под которым пользователь зарегистрирован в системе MOC ЕС, либо ключевое слово all, означающее "для всех пользователей базы данных". В поле терминал указывается логический адрес термина¬ ла, работая за которым пользователь получает данные права, в формате ttyxxx, или ключ a//, означающее "при работе за любым терминалом системы". Отсутствие группы at равносильно заданию ключа all. Логические адреса тер¬ миналов можно узнать, просмотрев каталог /dev командой: ls /dev а логический адрес терминала, за которым работает пользователь, можно узнать, выполнив команду монитора shell tty Пример 11.14. -ГОТОВО-> tty /dev/ttyOc3 -ГОТОВО-> Список атрибутов задается перечислением через запятую имен атрибутов отношения, на которые распространяются полномочия, или ключом all ("все атрибуты отношения"). В полях время задается временной интервал, в течение которого действуют указанные полномочия. Время задается в формате чч:мм (чн - часы, мм - минуты), при этом часы 184
* могут задаваться в интервале от 00 до 24, а минуты - от W 00 до 59. 1 Поля день по аналогии с полями время задают период [ недели, в течение которого задаваемые полномочия дейст- ! вительны. Значения полей день задаются трехсимвольной аббревиатурой дней недели (Mon - понедельник, Tue - вторник, Wed -среда, Thu - четверг, Fri -пятница, Sat - суббота, Sun - воскресенье). Ограничения, определяемые различными частями опера¬ тора define permit, обрабатываются системой как связанные логическим "и". Пример 11.15. Определить для пользователя с идентифи- i катором a505 при его работе за терминалом ttt9c2 с понедельника по пятницу с 8 ч. 30 мин. до 17 ч. 45 мин. возможность читать и изменять значения атрибутов долж¬ ность и оклад отношения сотрудник и только читать значения атрибута фио: * range of a is сотрудник * define permit retrieve,replase of a [ (должность,оклад) to a505 at tty9c2 from 8:30 to 17:45 on Mon to Fri j * define permit retrieve of а (срио) to a505 f at tty9c2 from 8:30 to 17:45 on Mon to Fri Рассмотрим еще один пример: * range of b is должность * define permit all to b all to a506 at tty3c2 * define permit retrieve to b all at all * \g Первый оператор define в данном примере разрешает пользователю a506 при его работе за терминалом выполнять любые операторы языка QUEL над всеми атрибутами отношения должность. Второй оператор разрешает всем пользователям системы, работающим за любыми терминалами, только читать значения атрибутов отношения. Если пользователь a506 будет работать с базой данных с любого терминала, отличного от tty3c2, то он будет иметь возможность только читать данные из отношения дол¬ жность, но их коррекцию проводить не может. Таким обра¬ зом, при определении нескольких операторов defme 185
permit система обрабатывает их как связанные логическим "или”. При определении полномочий на выполнение оператора append (добавить строку в отношение) в списке атрибутов необходимо задавать ключ all, так как в противном случае пользователь, которому разрешается выполнять эту опера¬ цию, воспользоваться им не сможет. Полномочия по использованию отношения могут быть и более жесткими, если в операторе define permit задать ограничения на значения атрибутов. Пример 11.16. Разрешить читать и изменять пользовате¬ лю a510 в отношении должность строки, содержащие данные о научных должностях с максимальным окладом не более 300 рублей: * range of а is должность' * define permit retrieve,replace to а all to а%\ where а.имя="*НС" and а.тах__оклад<=300 * \д В данном примере предполагается, что в отношении должность наименования научных должностей хранятся в виде аббревиатуры (МНС - младший научный сотрудник, BHC -ведущий научный сотрудник и т.д.). Для формирования поискового образа наименования должности использован метасимвол *. Использование метасимволов в СУРБД INGRES ничем не отличается от их использовании в редакторе ned (см. гл. 2). Существуют также две специальные формы оператора define permit, определяющие наиболее распространенные ситуации указания полномочий. С целью повышения эффек¬ тивности работы с базой данных эти операторы обрабаты¬ ваются специальным образом. Первая форма задает все допустимые полномочия для всех пользователей на всем отношении, определяемом ранговой переменной, и имеет вид: define permit all on ранговая^переменная all Вторая форма определяет полномочия для всех поль¬ зователей по использованию оператора retrieve на всем отношении: define permit retrieve of ранговая__переменная to all 186
Пример 11.17. * range of a is сотрудник * define permit all on a all * range of a is должность * define permit retrieve of b to all * \g После выполнения данного примера все пользователи могут выполнять любые действия над отношением сотрудник и только читать данные из отношения должность. В процессе работы с базой данных может потребоваться переопределение ограничений целостности и полномочий по доступу к отношениям базы данных. Данное переопределение выполняется в два этапа. На первом этапе отменяются существуюшие ограничения и полномочия, а на втором - устанавливаются новые. Для отмены ограничений целостности служит оператор destoy вида destroy integrity имя_отношения список^ограничений Список ограничений состоит из разделенных запятыми номеров ограничений или ключа a//, предписывающего отменить все ограничения целостности, наложенные на отношение. Номера ограничений целостности можно получить, выполнив оператор help integrity, который "печатает” все наложенные ограничения на отношение и их номера. Пример 11.18. * help integrity должность \д Integrity constraints on сотрудник are: Integrity constraint 0 - range of c is сотрудник define integrity on c is (с.оклад >= 70) and (с.оклад <= 450) * destroy integrity должность 0 \g Аналогичным образом отменяются полномочия по доступу к отношению: destroy permit имя__отношения список_полномочий 187
Пример 11.19. * help permit сотрудник \g * Permissions on сотрудник are: Permission 0 - range of c is сотрудник define permit retrieve, replace on c (должность, оклад) to a505 at tty9c2 from 8:30 to 17:45 on monday to friday Permission 1 - range of c is сотрудник define permit retrieve on с (фио) to a505 at tty9c2 from 8:30 to 17:45 on monday to friday * destroy permit сотрудник 1 * help permit сотрудник \g Permissions on сотрудник are: Permission 0 - range of c is сотрудник define permit retrieve, replace on c (должность, оклад) to a505 at tty9c2 from 8:30 to 17:45 on monday to friday * Отметим, что при создании отношений оператором create для любого из них устанавливается семидневный срок хранения, по истечении которого они могут быть уничто¬ жены при выполнении администратором базы данных коман¬ ды MOC ЕС purge, имеющей вид purge имя__вазы_данных В случае, если недельный срок хранения не устраивает пользователя, он должен установить, до какого срока необходимо хранить то или иное отношение. Для этого ему достаточно выполнить оператор save вида save имя^отношения until месяц день_год Пример 11.20. * save сотрудник until 10 25 1989 \g * 188
Для уничтожения отношения используется оператор destroy следующего вида: destroy имя_отношения [,имя__отношения ] ... После того как создана схема отношения, в него можно заносить строки. Для занесения строк в отношение можно воспользоваться оператором append, имеющим следующий вид: append to имя__отношения ( целевой_список ) where условие Поле целевой список содержит один или несколько эле¬ ментов, разделяемых запятыми. Каждый элемент списка может задаваться в одной из следующих форм: а) иня__атривута is выражение, где поле имя атрибута содержит имя атрибута отношения, которому должно быть присвоено значение, получаемое в результате вычисления выражения; вместо ключевого слова is можно использовать знак = (равенство): имя__атривута=выражение в) ранговая_переменная.имя__атриБута (эту конструкцию называют атрибут-переменной); в) ранговая_переменная.а11 Для представления списка всех имен атрибутов отноше¬ ния, определяемого некоторой ранговой переменной, можно использовать ключевое слово all. Выражение может задаваться константой, атрибут-пере- менной, функциональным или арифметическим выражением. Пример 11.21. Добавить в отношение сотрудник новую запись: * append to сотрудник ($ис="Зайцев Я.Л.", год_рождения=1925,должност*="СНС”,степень="КТН", оклад=300) * \я 189
Пример 11.22. Добавить в отношение сотрудник новую запись о сотруднике Сурнове С.И., который назначен на должность ведущего научного сотрудника с максимальным окладом: * range of а is должность * append to сотрудник (срио=щ,Сурнов С.И.", год__рождения=1953,степень="КТН", оклад=а. тах__оклад,должность=а. имя) where а.имя=”ВНС” * \д В данном примере в целях повышения достоверности вно¬ симых в БД данных значение атрибута должность отношения сотрудник устанавливается равным значению атрибута имя отношения должность (должность=а.имя). При наборе запроса на языке QUEL в поле команд монитора интерактивного режима СУРБД INGRES (две строки) может не хватить места. В этом случае можно вводить запрос по частям или воспользоваться экранным редактором текстов ned. Для перехода в режим редактора достаточно выполнить команду монитора вида \ried (или просто \n). После выполнения команды \п пользователь с помощью средств редактора (см. гл. 2) может сформировать запрос любого объема. После того как запрос сформирован, его необходимо сохранить в буфере монитора. Для этого достаточно выполнить первичную команду редактора w. После выхода из редактора (первичная команда q) пользователь может выполнить сформированный запрос по команде монитора \g. Редактор ned также удобно использовать для корректировки запроса, хранящегося в буфере. Пример 11.23. Добавить в отношение сотрудник запись о новом сотруднике Белоглазове B.A., назначенном на долж¬ ность заместителя начальника отдела со средним окладом: * append to сотрудник (фио='*Белоглазов В.А.”, * год_рождения=1939, * степень="КТН”,должность=а.имя, * оклад= ( а .mi п__оклад+а. тах__оклад )/2 ) * where а.имя=”ЗН0" * \я В данном примере не определялась ранговая переменная а на отношении должность в предположении, что она была 190
определена при выполнении предыдущего примера и в сеансе работы не перезакреплялась за другими отношениями. Просмотреть текущее содержимое буфера запроса можно, выполнив команду 'yprint (или просто ^?). Если после выполнения запроса необходимо его повто¬ рить, но с включением в него дополнительных операторов, то требуется ввести команду \append (или просто \а), после выполнения которой можно добавлять новые операторы в буфер. Однако и в этом случае можно, воспользоваться редактором ned. Пример 11.24. * print должность \д должность relation I ИМЯ | max__oK min_OK|степен количе I ГНС I 450 | 400\ДТН 1 |BtfC | 400 350|КТH 1 | CHC | 350 250{KTH 5 I ПС | 270 i75 j 3 I МНС I 220 140 | 10 |ИЭ-ГГ кат. j 25C 210\ 1 |иэ-ш кат. j 230 190 | 1 \техник-11 кат. | 170 140 | 3 I НА I 400 350\КТН 2 |3tf0 I L L 450 I 400j КТH I I I 1 I I * \р print должность * \а * help должность * \р print должность help должность * \д должность relation | имя I max_jDK | min_OK|степен j | |количе j I I ГНС 450 I I | 400\ДТН i | 1 j BHC 400 j 350]KTH | 1 | CHC 350 250 КТH 5 | НС ■ 270 j 175 j I 3 191
| мнс 220 | 140 I 10 | |иэ-и кат. 250 | 210 I 11 |иэ-гп кат. 230 I 190 I 11 |техник-II кат. 170 | 140 I jj I НА 400 | 350 KTH I 2| I зно I I 450 | I I 400 KTH I I 11 I Relationx Ownerx Tuple widthz Saved untilz Number of tuplesx Storage structurex Relation typex attribute name type ДОЛЖНОСТЬ a513 25 Sat Mar 18 12x57x58 1989 10 paged heap user relation length keyno. имя с 15 тах_оклад i 2 т1п_оклад i 2 степень с 4 количество i 2 * Для очистки буфера запроса (например, при вводе ошибочного оператора) достаточно выполнить команду \reset (или \г). Помимо оператора append для создания строк отношения СУРБД INGRES предоставляет в распоряжение пользователя также оператор сору. Оператор сору позволяет копировать данные из файлов MOC ЕС в отношения базы данных и обратно. Оператором сору удобно пользоваться при ини¬ циализации базы данных, когда идет массовая загрузка данных, а также в том случае, если пользователь хочет воспользоваться средствами MOC ЕС (редактирование, форматирование, сортировка и т.п.) для 1 подготовки документа на основе данных, полученных из БД. Оператор сору имеет следующий формат: сору имя__отношения ( имя__атриБута=формат [,имя_атриБута=формат] ...; into | from "полное_имя__файла” Ключевое слово into в команде сору предписывает копирование данных из отношения БД в файл MOC ЕС, клю¬ чевое слово from - копирование из файла MOC ЕС в отношение. Поле полное^лма^файяа должно содержать полное имя файла от корневого сегмента системы, заключенное в 192
кавычки. При копироЖании из файла в отношение последнее не должно иметь вторичного индекса и должно быть обновляемым. Оператор копирования нельзя использовать для виртуального отношения. При копировании обеспечиваются следующие форматы: i2, i4 - данные хранятся в файле MOC ЕС как целые числа длиной 2 или 4 байта соответственно; f4, f8 - данные хранятся в MOC ЕС как числа с плавающей точкой (обычной или двойной точности); cl, c2, ..., c255 - данные хранятся в файле как символьные строки постоянной длины; c0 - данные хранятся в файле как символьные строки переменной длины; dl, d2, ..., d255 - фиктивные поля в файле постоянной длины; d0 - фиктивные поля в файле переменной длины. По умолчанию в качестве разделителей полей в файле MOC ЕС выступают запятая (,), пробел или символ новой строки (\п). Система INGRES позволяет пользователю в качестве разделителей полей в файле определять при необходимости и любые другие символы. Пример 11.25. Скопировать данные из файла /mntsys/ илус/Ь513/сотрудник в отношение сотрудник. При этом предполагается, что все данные в файле хранятся в символьном виде (файл подготовлен с помощью редактора ned, см. гл. 2) в следующем порядке: Блажнов В.Ю.,Орлов В.Н.,русский,1949,НЛ,КТН,350 Барвин О.А.,Блажнов В.Ю.,Белорус,1961,МНС,,170 Стерехова Л.Я.,Блажнов В.Ю.,русская,1951г техник-II кат.,,140 Сурнов •А•9Орлов В.Н.,украинец,1953,ЗНО,КТН,400 Комарчук В.А.,Блажнов В.Ю.,русский,1948,СНС,,250 Маслов А.А.,Блажнов В.Ю.,украинец,1947,СНС,КТН,260 * сору должность (фио=сО,начальник=сО,фикт=сЮ, год_рождения=сО, должность^сО,степень=сО,оклад=сО) from "/mntsys/uwc/b51З/сотрудник" * \я В данном примере для пропуска поля национальность в файле MOC ЕС использован фиктивный атрибут с произволь¬ ным именем (в примере имя фикт) с форматом d0. Следует иметь в виду, что система INGRES обеспечивает 193
автоматическое преобразование форматов данных при их копировании из файла в отношение базы данных, и наобо¬ рот. Так, в данном примере при копировании данных в атрибут оклад данные из символьного вида будут преобра¬ зованы в формат i2, который определен в схеме отношения сотрудник. Пример 11.26. Скопировать в файл /mntsys/uwcyb513/ должность из каждой строки отношения должность имя должности и количество должностей данного типа, при этом отделив поле имя должности от поля количество запятой и завершая каждую строку символом новой строки: * сору должность(имя-сО, comma=dl, количество-сО, nl-dl) into ”/тп1вуБ/иис/Ь513/должность" * \я В результате выполнения этой команды будет сформи¬ рован текстовый файл следующего вида: гнс , 1 1 внс , 1 снс , 5 нс , 3 МНС , 10 иэ-ll кат. , 1 ИЭ-IIl кат. , 1 техник-II кат. , 3 нл , 2 зно , 1 При копировании из отношения в файл разделители полей вставляются в файл по признаку фиктивного поля (символ d) столько раз, сколько указано в признаке (d0, dl, ..., d255). При этом в качестве имени атрибута для фиктивного поля могут выступать: nl - символ новой строки; tab - символ табуляции; sp - пробел; nul или null - нулевой символ (код XW); comma - запятая; colon - двоеточие; 194
dash - тире; lparen - левая скобка; rparen - правая скобка; x - любой символ ихм. В нашем примере в качестве разделителей мы исполь¬ зовали запятую (comma=dl) и признак новой строки (nl=dl). Для поиска и выдачи хранимых в базе данных сведений используется оператор retrieve, который позволяет не только направлять отобранные данные в стандартный вывод (в терминальном режиме это экран терминала), но и в новое отношение. Оператор retrieve имеет следующий формат: retrieve [[into] имя__отношения ] ( целевой^список ) [where условие ] Пример 11.27. Выдать на экран терминала все строки отношения сотрудник: * range of а is сотрудник * retrieve (a.all) \g фИО | начальник | год__p j I должн. сте|окл i Блажнов В.Ю. 1 I |Орлов В.H• | 1949 НА I KTH{350 Барвин O.A. \Блажнов В.Ю.| 1961 МНС j 170 Стерехова Л.Я. |Блажнов В.Ю.| 1951 техник | 140 Сурнов .А. |Орлов B.H. | 1953 ЗНО KTHj 400 Комарчук B.A. \Блажнов В.Ю.j 1948 CHC , 1250 Маслов A.A. l |\Блажнов В.Ю. j 1947 J l l CHC I КТH|260 I I * Заметим, что выдать содержимое какого-либо отношения в стандартный вывод можно также оператором print, который по выполняемым функциям аналогичен команде printr монитора shell: print имя^отношения [,имя_отношения] ... Пример 11.28. Выдать наименование должностей и их оклады при условии, что минимальный оклад не менее 200 рублей, а максимальныйне более 300 рублей. 195
* range of в is должность * retrieve (в.имя, в.min__oклaд, в.тах__оклад) where в.min_oклaд>=200 and в.тах^оклад<=300 * \я |имя |min ок\тах ок\ I 1 1 i jИЭ-II кат. I 210| 250| 1 I l l * Пример 11.29. Выдать список служащих, чей оклад ниже среднего по отделу, включающий оклад служащего, средний оклад по отделу и максимальный оклад по занимаемой должности. Список отправить в отношениоповьаиение. * range of a is сотрудник * range of в is должность * retrieve into повышение(а.фио,а.должность, * a.oклaд,cpeдний=avg(a^oклaд), * Ь.тах__оклад) where a.oклaд<avg(a.oклaд) * and а.должность=Ь.имя * \д * После выполнения этого примера будет создано новое отношение повьаиение, имена и последовательность атрибутов которого определяются целевым списком оператора retrieve. По умолчанию для нового отношения (в данном примере отношение повышение) обеспечивается структура хранения типа cheapsort и в процессе ввода новых строк автоматически исключается дублирование строк в отношении. Если структура chepsort для нового отношения нежелательна, то пользователь может переопределить ее с помощью оператора define. Установить тип структуры хранения отношений, создаваемых оператором retrieve, можно также и при выполнении команды ingres, путем задания флага -rM, где M принимает одно из следующих значений: isam, cisam, hash, chash, heap, cheap или cheapsort. Например, по команде ingres -risam otdel будет определена индексно-последовательная структура хранения для всех отношений, создаваемых оператором retrieve. 196
Отметим также, что создаваемое оператором retrieve into отношение имеет семидневный срок хранения. Для yc- ; тановления более длительного срока хранения необходимо воспользоваться оператором save. В данном примере для определения среднего оклада по ‘ отделу использовался агрегатный оператор avg ( а.оклад< (avg(a.OKAad) ), а для включения нового атрибута в отношение повышение использовалось новое имя атрибута , средний (cpedHuU=avg(a.OKAod)). В системе INGRES предус- f. мотрены следующие агрегатные выражения: count - счетчик вхождений (счетчик строк) значений [ атрибута в отношение (формат результата i4); [ countu - счетчик уникальных вхождений атрибута в f отношение (i4); sum - суммирование значений атрибута; sumu - суммирование уникальных значений атрибута; avg - среднее значение атрибута (sum/count) (f8); avgu - среднее от уникальных значений атрибута (sumu/countu) (f8); max - максимальное значение атрибута; min - минимальное значение атрибута; any - возвращает значение, равное 1, если хотя бы одна строка удовлетворяет заданному условию, в противном случае - 0 (i2); [ Пример 11.30. Выдать справку о самых низкооплачивае¬ мых сотрудниках: * range of a is сотрудник * retrieve (a.all) where а.оклад=т1п(а.оклад) * \я фио |начальник I |годр\должность J I ст|окл| j | I СтереховаЛ.Я.|БлажновВ.Ю. l I I | 1951\техник-11 кат J__ i l 1140 | I I I ★ С помощью оператора retrieve можно вести и контекстный поиск данных. В этом случае поисковый образ в условии необходимо задавать с помощью метасимволов. Пример 11.31. Выдать справку о научных должностях: * range of а is должность * retrieve (a.ail) where а.имя=”*НС" * \я 197
I ИМЯ I |max_OK 11 I L min ок\степен I | количе| j i I I ГНС г I г 450 j I 400|ДТН 1 I l ^l I BHC I 400 | 350{KTH l Ц I снс I 350 j 250 КТH I 5| I НС I 270 | 175 | I з\ I МНС I I 220 j L 140 j l I ю | J | (5 tuples) В языке QUEL существует специальная форма оператора retrieve, которая выбираемые строки сортирует по перво¬ му атрибуту и исключает дублируемые строки. Пример 11.32. Выдать список фамилий всех начальников: * range of а is сотрудник * retrieve ип1дие(а.начальник) * \я |начальник \ jОрлов B.H. I jБлажнов В.Ю. j l l ★ Применение для этих целей оператора вида retrieve (а.начсигъник) привело бы к тому, что фамилия каждого начальника была повторена столько раз, сколько сотрудников у него в подчинении: |начальник | i i jОрлов B.H. |Блажнов В.Ю. |Блажнов В.Ю. |Орлов B.H. |Блажнов В.Ю. |Блажнов В.Ю. I I 198
Отметим также, что помимо агрегатных выражений система INGRES допускает также использование функцио¬ нальных выражений, в состав которых входят: abs(n)- абсолютное значение (формат тот же, что и у п); ascii(n) — преобразование числа в символьную стро¬ ку; atan(n) - арктангенс (f8); concat(a,b) — сцепление символьных строк (символь¬ ная строка); cos(n) — косинус (f8); exp(n) — экспонента (f8); gamma(n) — десятичный алгоритм (f8); log(n) - натуральный логарифм (f8); mod(n,b) — n по модулю b (n и b должны иметь фор¬ маты il, i2, или i4); sin(n) - синус (f8); sgrt(n) — квадратный корень (f8), где n - произ¬ вольное выражение. Для изменения значений атрибутов в определенных стро¬ ках отношения используется оператор replace следующего вида: replace ранговая^переменная ( целевой_список ) [ where условие ] Перед выполнением оператора replace с помощью опе¬ ратора range на отношении должна быть определена ранговая переменная. В поле целевой список должны указываться только атрибуты, значения которых модифи¬ цируются. Следует отметить, если проводимая модификация вступает в противоречие с определенными на отношение ограничениями целостности (оператор defini integrity), то она не выполняется. Пример 11.33. Увеличить на 10% оклад сотрудникам, родившимся до 1940г. : * гапде of m is сотрудник * replace m (оклад = 1.1*т.оклад) where т.год__рождения<1940 * \я * 199
Пример 11.34. Сотрудник Горелов C.B. назначен на должность старшего научного сотрудника со средним окладом: * range of r is сотрудник * range of k is должность * replace r (оклад = (к.т1п_оклад+к.тах__оклад)/2, * должность = к.иия) where к.имя = "CHC" * and г.фио=”Горелов C.B." * \я * Для удаления строк из отношения используется оператор delete вида delete ранговая_переменная [ where условие ] Пример 11.35. Удалить все строки отношениия повыше¬ ние: * range of а is повышение * delete а \д * Пример 11.36. Исключить из отношения сотрудник все сведения о научных сотрудниках: * range of 1 is сотрудник * delete 1 where 1.должность=”*НС” * \д * Пример 11.37. Исключить из отношения сотрудник все строки, содержащие сведения о сотрудниках с минимальным должностным окладом: * range of а is сотрудник * range of b is должность * delete а where а.должность-Ь.иия and * а.оклад=Ь.т1п__оклад * \я * 200
СУРБД INGRES позволяет создавать на основе ранее определенных отношений виртуальные отношения. Для этих целей служит оператор следующего вида: define view имя_отношения ( целевой^список ) [ where условие ] Синтаксис оператора define view подобен синтаксису оператора retrieve into. Однако в отличие от последнего под действием оператора define view данные не сохраня¬ ются. В системе сохраняется только схема нового отношения. При появлении в запросе имени виртуального отношения система обеспечивает выполнение запроса через реальные отношения, на которых определен виртуальный атрибут. Система обеспечивает реализацию на виртуальных отно¬ шениях всех видов поиска. Однако обновление виртуального отношения возможно только в том случае, если оно определено только на одном реальном отношении. Пример 11.38. Определить на отношении сотрудник вир¬ туальное отношение, содержащее фио, должность, оклад сотрудника и фио, должность, оклад, год рождения его начальника. * range of а is сотрудник * range of b is сотрудник * define view сведения (фиос=а.фио, окладс=а.оклад, * должностьс=а.должность, начальникс=а.начальник, * фион=а.начальник,окладн-b.оклад, * должностьн=Ь.должность, * год_рождениян=Ь.год_рождения) * where а.начальник=Ь.фио * \д Для просмотра схемы виртуального отношения достаточно выполнить команду следующего вида: help view имя__отношения [иия^отношения] ... Пример 11.39. * help view сведения * \д 201
Relation: сведения Owner: a513 duple width: 96 Saved until: Sat Mar 18 14:33:58 Relation type: v i ew attribute name type length keyno. фИОС с 20 окладе i 2 должностьс с 15 начальнике с 20 фИОН с 20 окладн i 2 должность с 15 год^рождения i 2 * При работе с монитором интерактивного режима СУРБД INGRES допускается подготовка запросов (как правило, громоздких и наиболее часто используемых) в отдельных файлах пользователя. Для считывания запроса из файла в буфер монитора служит следующая команда: \read имя^райла или \г имя^срайла Пример 11.40. * \r /mntsys/uwc/b513/filepov * \р range of а is сотрудник range of в is должность retrieve into повышение(а.фио,а.должность,а.оклад, средний=ауд(а.оклад),Ь.тах__оклад) yhere а.оклад<ауд(а•оклад) and а.должность-Ь•имя * \я * Пользователь также может сохранить содержимое буфера запроса в некотором файле. Для этого служит команда сле¬ дующего вида: \write имя^срайла или \w имя^срайла Не выходя из монитора интерактивного режима пользо¬ ватель может обратиться к монитору shell по команде \shell (или \sh или \s). Если в качестве параметра 202
команды \shell указано имя файла, то данный файл рассматривается как командный и в качестве значения 1 (см. гл. 7) передается буфер запроса. Для выхода из монитора интерактивного режима СУРБД INGRES служит команда \q. Выше были рассмотрены некоторые команды MOC ЕС по работе с базами данных, а именно: creatdb — создать базу данных; destroydb — уничтожить базу данных; purge — удалить временные отношения и отношения с истекшим сроком хранения; Ле/^г — просмотреть схему отношений базы данных; printr — просмотреть содержимое отношений базы данных; ingres — вызвать монитор интерактивного режима. Рассмотрим еще несколько команд MOC ЕС, связанных с сопровождением баз данных. Для повышения эффективности доступа к базе данных служит команда sysmod: sysmod [s] [+-w] имя__Базы__данных [имя__системного__отношения] ... Команда sysmod преобразует структуру хранения сис¬ темных отношений (relation, attribute, indexes, tree, protect и integrity) в хешированную структуру (hast - структуру). Если имена отношений не указаны, то хеширу¬ ются все системные отношения. Команду имеет право выда¬ вать администратор базы данных или привилегированный пользователь (флаг -s). Команду рекомендуется выдавать сразу же после созда¬ ния базы данных по команде creatdb и далее регулярно по мере развития базы данных. Чем чаще меняется схема базы данных, тем чаще должна выполняться команда sysmod. Команда sysmod, так же как и команды purge и restore, захватывает базу данных на время своей работы в монопольное использование. Если при выдаче команды sysmod база данных оказалась уже захваченной в монополь¬ ное использование и установлен флаг +w (режим ожидания), то команда переходит в режим ожидания и продолжит свою работу после освобождения базы данных. Если же установлен флаг -w, то выдается сообщение о недоступнос¬ ти базы данных, и выполнение команды прекращается. При работе с базой данных часто требуется провести архивное копирование либо всей базы данных, либо отдель¬ 203
ных ее отношений. Для этих целей используется команда copydb, имеющая следующий вид: copydb [—иимя] имя__вазы__данных полное__имя_каталога [имя_отношения] ... Команда copydb создает в каталоге, имя которого указано в поле noAHoe_uMzjcaranoea, два файла. Файл с именем copy.out содержит QUEL-программу для копирования всех (или только тех, что указаны в команде) принадлежащих пользователю отношений базы данных в файлы указанного каталога. При этом файлы будут создаваться с теми же именами, что и копируемые в них отношения с добавлением к этим именам двухсимвольного идентификатора пользователя системы INGRES. Файл с именем copy.in содержит QUEb-программу для обратного копирования файлов в отношения и выполнения необходимых преобразований, с тем чтобы обеспечить ту же структуру хранения отношений, которая была до снятия копий. Для снятия собственно копии базы данных необходимо выполнить команду ingres, на стандартный ввод которой переадресован файл copy.out. Для восстановления базы данных также требуется выполнение команды ingres, но с переадресацией на ее стандартный ввод файла copy.in. Пример 11.41. -ГОТОВО-> pwd /mntsys/uwc/b513 -ГОТОВО-> mkdir OTDEL -ГОТОВО-> copydb otdel /mntsys/uwc/b513/OTDEL -ГОТОВО-> ingres otdel<OTDEL/copy.out -ГОТОВО-> tar cf /dev/mtl81 OTDEL -ГОТОВО-> rm —f OTDEL/*;rmdir OTDEL -ГОТОВО-> mkdir OTDEL -ГОТОВО-> tar xf /dev/mtl81 OTDEL -ГОТОВО-> 204
ingres otdel<OTDEL/copy.in -ГОТОВО-> В данном примере показано копирование базы данных otdel в каталог /mntsys/uwc^)513/OTDEL с последующим копированием этого каталога на ленту (команда tar), а также восстановление каталога с ленты с последующим восстановлением базы данных. Если при работе с базой данных произошло аварийное завершение, то для ее восстановления необходимо восполь¬ зоваться командой restore: restore [—а] [-s] [+—w] [имя_вазы__данных] ... Если имена баз данных не указываются, то будет про¬ ведено восстановление всех баз данных, для которых пользователь является администратором или привилегиро¬ ванным пользователем (флаг -s). Если задан флаг ^a, то перед тем, как будут предприняты какие-либо серьезные действия по восстановлению базы данных, будет выдаваться предупреждающее сообщение. В заключение приведем две shell-процедуры, которые, с одной стороны, демонстрируют возможности языка shell, а с другой стороны, будут полезны пользователям СУРБД INGRES. Первая процедура очень простая и позволяет пользова¬ телю с помощью редактора ned, не вызывая монитора интерактивного режима, просматривать содержимое любого отношения: -готово-> cat rdrel printr $1 $2]ned -ГОТОВО-> Обращение к процедуре rdrel имеет вид: sh rdrel имя__вазы__данных имя_отношения или, если вы сделали файл rdrel выполнимым: rdrel имя__вазы_данных имя отношения Вторая процедура correl намного сложнее и позволяет пользователю вносить изменения, в том числе и добавлять новые строки в существующее отношение базы данных. В 205
данной процедуре для внесения изменений также использу¬ ется редактор ned: —ГОТОВО—> cat correl a=$l;e=$2;c=$3 if test $§ —lt 3 then echo "параметров меньше чем три" exit fi set*helpr $a $e\tail +13* chapka="==$l" b="copy $e($l=cO";bl=$b;shift;shift;shift while test —n "$1" do all=aa;all=*expr 1000 — $1* if test r-n "$all" then shift. fi b="$b,comma=d1,$ 1=c0";chapka="$chapka==,==$1" bl="$bl,$l=cO";shift}shift}shift done b="$b,nl=dl)into $c" echo $b>/tmp/bd echo "\g"»/tmp/bd echo "\q"»/tmp/bd ingres $a</tmp/bd>/tmp/bdl if test $? -ne 0 then echo "проверьте параметры" cat /tmp/bdl;rm —f /tmp/bdl /tmp/bd exit fi x=*expr $c : '.\(.*\).'*}echo "$chapka==">/tmp/bd cat $x>>/tmp/bd ned /tmp/bd tail +2 /tmp/bd>$x d="$bl)from $c" oo="range of a is $e" echo $oo>/tmp/bd echo "delete a">>/tmp/bd echo $d>>/tmp/bd echo "\g"»/tmp/bd echo "\q">>/tmp/bd ingres $a</tmp/bd>/tmp/bdl if test $? —ne 0 then echo "корректировка отношения проведена с ошив.камй" 206
cat /tmp/bdl',rm —f /tmp/bd /tmp/bdl exit fi rm —f /tmp/bd /tmp/bdl echo "корректировка отношения проведена" -ГОТОВО-> Обращение к процедуре correl имеетследующий вид: correl имя_вазы_данных имя_отношения \”полное_имя_файла\” Имя файла, в котором будет сохранено содержимое отношения со всеми вносимыми пользователем изменениями, должно заключаться в кавычки. Для отмены специального смысла кавычек используется обратная косая черта. Проце¬ дура correl является логическим завершением изложенного вданнойкнигематериала. / ЛИТЕРАТУРА 1. Kpucrum К. Введение в операционную систему UNDC. - M.: Финансы и статистика, 1985.- 318 с. 2. Браун П. Введение в операционную систему UNDC. - M.: Мир, 1987.- 287 с. 3. Баурн С. Операционная система UNDC. - M.: Мир, 1986. - 294 с. 4. Орлов В. Операционные системы: зачем они инженеру?- Техника и наука, 1987, N 7, с. 36-38. 5. Громов Г. P. Национальные информационные ресурсы: проблемы промышленной эксплуатации. - M: Наука, 1985. - 378 с. 6. Беляков М.И., Аиверовский AJO. и др. Инструментальная мобильная операционная система ИНМОС. - M.: Финансы и статистика, 1985.- 226 с. 7. Пржиялковский B.B., Аомов Ю.С. Технические и програм- мые средства единой системы ЭВМ. - M.: Статистика, 1980.-232c. 8. Зверев В.И., Кетков ЮА., Максимов B.C. Алфавитно- цифровые дисплеи EC7920 в диалоговых системах. - M. : Наука, 1986.- 240x. 9. Топхем A-, Чъюнг X.B. Юникс и Ксеникс. - M.: Мир, 1988.-390c. 207
ОГЛАВЛЕНИЕ Введение 3 P А 3 Д E Л 1. ОСНОВНЫЕ ВОЗМОЖНОСТИ ОПЕРАЦИОННОЙ СИСТЕМЫ MOC ЕС 9 Глава 1. Начало работы, электронная почта, электронный телефон 9 Глава2. Редактированиетекстовыхфайлов 17 Глава 3. Файлы, каталоги, разграничение доступа 37 Глава 4. Работа с файлами 50 Глава 5. Управление процессами 66 P А 3 Д E Л 2. ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ SHELL 80 Глава 6. Командные файлы 80 Глава7. ПеремейныеязыкаэЬеПиработасними 89 Глава8. Управляющиеконструкции 109 P А 3 Д E Л 3. ДОПОЛНИТЕЛЬНЫЕ СВЕДЕНИЯ 0 MOC ЕС 129 Глава 9. Организация файловой системы 129 Глава 10. Программирование диалоговых программ 142 Глава 11. Система управления реляционными базами данных INGRES 168 Литература 207 Справочное издание Орлов Владимир Николаевич Блажнов Валерий Юрьевич Барвин Олег Анатольевич Мобильная операционная система MOC ЕС Оригинал-макет книги изготовлен авторами с помощью текстового процессора LEXICON. Зав. редакцией И. Г. Дмитриева, Редактор Л.Д.Григоръева Мл. редакторы А, Ю. Поляк, T. А. Студеникина Худож. редактор С.Л.Витте, Тех. редактор Г. А. Полякова Корректор T. M. Васильева ИБ № 2553 Подписановпечать20.11.89. A09672. Формат60х881/16 Бум.офсетная. Гарнитура **Литературная”. Печать офсетная. Усл.п.л. 12,74. Усл.кр.-отт. 12,99. Уч.изд.л. 9,91. Тираж 30000 экз. Заказ 1154. % Цена 50 коп. Отпечатано в типографии им. Котлякова издательства ”Финансы и статистика” Государственного комитета СССР по печати. 195273, Ленинград, ул. Руставели, 13.