DAY18 (Старые версии Машбука или нечто подобное)
Описание файла
Файл "DAY18" внутри архива находится в следующих папках: Старые версии Машбука или нечто подобное, Лекции (Машечкин 1998). Документ из архива "Старые версии Машбука или нечто подобное", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "DAY18"
Текст из документа "DAY18"
4
Лекция №18Лекция №18
Сегодня у нас будет достаточно короткая и специфическая лекция, речь будет идти о командных языках. В процессе повествования я часто буду ссылаться на то, что той или иной момент Вам нужно посмотреть в доступной литературе. Вопрос «Командные языки» достаточно простой, для детального понимания достаточно лишь взять соответствующую книжку и прочитать основные моменты.
Командные языки. Интерфейсы работы с пользователем
Одним достаточно важным с точки зрения обывателя критерием оценки операционной системы да и пожалуй всей вычислительной системы в целом является интерфейс, предоставляемый операционной системой для работы с пользователем. Вы имеете достаточно большой опыт по работе с интерфейсами. Вы, наверняка, пользовались интерфейсом MS DOS - командной строкой, работали с графическим, достаточно удобным интерфейсом MS Windows 95, который предоставляет разнообразные средства по работе с папками, файлами, DESKTOPом с использованием механизма ссылок, ассоциирования с различными графическими объектами.
В ОС UNIX есть целый спектр программных интерфейсов, обеспечивающих взаимосвязь пользователя с системой. Эти интерфейсы реализованы для различных аппаратных условий. Есть интерфейсы для работы в алфавитно-цифровом режиме, в котором контакт между пользователем и системой осуществляется в основном при помощи клавиатуры и дисплея. Есть интерфейсы, которые позволяют работать в графическом режиме. (Существуют UNIX-интерфейсы до мельчайших подробностей повторяющие интерфейсы Microsoft Windows 95. И неискушенному пользователю может показаться, что он работает в Windows.)
Сухой остаток заключается в том, что средства взаимодействия пользователя и системы очень разнообразны. Кроме того, подчеркну тот факт, что командный или если хотите пользовательский интерфейс - паспорт системы, по которой система узнается. (Одной из основных составляющих бешеной популярности Windows 95 является достаточно простой интуитивный графический интерфейс, но при этом качественной и эффективной эту операционную систему, если ее вообще можно назвать операционной системой, не назовешь.)
Возвратимся к ОС UNIX. Традиционными интерпретаторами команд в системе UNIX являются интерпретаторы CSH и BASH, которые произошли от классического, но давно устаревшего UNIX-интерпретатора SHELL (кратко SH). Интерпретатор команд в UNIX - это процесс, который запускается при входе пользователя в систему. ОС UNIX может поддерживать произвольное количество интерпретаторов команд. Конкретный тип интерпретатора размещается в информации о регистрации данного пользователя в системе в файле etc/passwd. В этом файле указывается полное имя одного из штатных стандартных интерпретатора команд или любое полное имя файла, который будет считаться интерпретатором.
Интерпретатор обеспечивает взаимосвязь между пользователем и системой. Он обеспечивает прием команд с клавиатуры и их обработку. Интерпретатор команд определяет правила работы процессов со стандартными устройствами.
Интерпретатор команд обеспечивает запуск процесса, а также связывание процесса (понятия конвейера, фильтра). Командный интерпретатор может быть представлен как некоторая виртуальная машина, которая имеет свою память, свои переменные (для построения выражений). Также в интерпретаторах команд имеются внутренние команды, которые реализуются средствами интерпретации, т. е. набор команд, предоставляемых пользователю, делится на две группы:
-
команды, с которыми связаны исполнительные файлы;
-
команды, поддерживаемые интерпретатором команд.
В частности, во многих интерпретаторах команд есть возможность сохранения истории работы пользователя (т. е. запоминаются последние n команд, набранные пользователем, имеется возможность просмотра этого списка, запуска и редактирования любой команды этого списка. Этот список иногда называют журналом команд.)
На сегодняшней лекции мы коснемся концептуального рассмотрения CSH - командного интерпретатора ОС UNIX, но для хорошего ответа на экзамене по этому вопросу Вам необходимо чуть более подробно посмотреть некоторые моменты, о которых будет сказано несколько позже, в доступной литературе по UNIX.
К основным свойствам командной строки интерпретаторов можно отнести следующее:
-
Интерпретатор команд имеет жесткий фиксированный формат командной строки, которая вводится пользователем. Командная строка имеет свою структуру. Она состоит из слов.
-
Существуют символы, которые могут служить разделителями слов в командной строке, например, « », «,», «.». Также имеется возможность экранировать символы-разделители, т. е. имеется возможность специальным образом при помощи определенной последовательности символов отменять роль «специальных» служебных символов командной строки.
-
В командной строке могут встречаться также метасимволы - это символы или комбинации символов из специального набора символов. Метасимволы интерпретируются предопределенным образом. (Пример который знают почти все: * - любое имя, ? - любой символ.) Соответственно, метасимволы тоже можно экранировать, указывая перед ними специальные символы. (Таким образом, в UNIX можно создать файл, содержащий в своем имени *).
Интерпретатор CSH и аналогичные ему имеют средства, позволяющие создавать программы на языке интерпретации, причем этот язык включает в себя высокоуровневые конструкции (циклы, условия, альтернативные переходы). В программах, написанных на языке интерпретации, имеется возможность декларирования переменных. Программа может вводиться как оперативно (строчка за строчкой и сразу интерпретироваться), так и при помощи записи в так называемый командный файл, который можно выполнить.
Интерпретатор команд (Мы по-прежнему говорим о интерпретаторах команд типа CSH.) позволяет осуществлять группировку команд, за счет перенаправления или установки потоков входных/выходных данных и может включать в себя большое число команд. (Частный пример группировки - конвейеры.)
Переменные CHS
Поговорим немного о переменных CHS. Их суть заключается в том, что среди всех переменных, которые можно определить при написании программ на языке интерпретатора команд, имеется определенный набор имен, имеющих предопределенную интерпретацию в системе, мы назовем эти переменные специальными. В частности, мы с Вами говорили, что UNIX - демократичная система, открытая для развития, - ее можно обогащать своими командами. При этом возникает проблема: раз система «открыта», то команды не должны привязываться к определенному фиксированному местоположению, все команды должны быть равноправны. Существует решение этой проблемы - переменная интерпретатора команд path («дорожка»), представляющая собой массив текстовых строк, содержащая полные имена каталогов, в которых следует осуществлять поиск команд. Суть решения такова. Вы набираете некоторую команду, и у командного интерпретатора возникает делема: где искать соответствующую команду? Переменная path определяет каталоги, в которых будет осуществляться поиск и порядок, в котором он будет осуществляться. Можно установить разные режимы поиска, но основная суть алгоритма поиска такова: сначала идет поиск в домашнем каталоге пользователя, потом, если команда не найдена, в первом каталоге, указанном в path, затем в следующем каталоге из path и т. д. Если команда не найдена ни в одном из каталогов, то будет выдано соответствующее сообщение. Замечу, что полное имя домашнего каталога содержится в home - специальной переменной интерпретатора команд. Внимательные студенты наверное заметили, что таким образом можно «закрывать» или варьировать некоторые команды, т. е. при задании полного и краткого путей одна и та же команда может трактоваться по-разному.
Эти же «внимательные» студенты должны были заметить, что исполнение команд по такой схеме - довольно неэффективно: в path может быть указано много каталогов, а открытие каждого файла в UNIX - весьма и весьма «дорогая» операция. (Можно конечно создать «интеллектуальный» path: сначала в нем будут идти каталоги, в которых находятся наиболее часто вызываемые команды, затем каталоги, содержащие менее «популярные» команды и т. д. Но, вообще говоря, - это не есть решение проблемы.) В системе UNIX существует элегантное решение возникшей проблемы. При входе пользователя в систему на основании значения переменной path (с учетом порядка каталогов) формируется hash-таблица команд, которая как раз хороша тем, что обеспечивает быстрый доступ к своим элементам. И в реальной работе при вводе команды ее поиск будет осуществляться не при помощи переменной path, а благодаря работе с hash-таблицей. (Сначала, конечно, без использования hash-таблицы идет поиск команды в home-каталоге.) За счет этого достигается значительное ускорение доступа к команде, хотя при входе в систему возможна задержка, которая вызвана формированием hash-таблицы.
Предположим, пользователь вошел в систему, а потом администратор добавил команду, которая этому пользователю необходима. Но за счет того, что hash-таблица уже сформировалась, доступ к ней (без набора полного имени) закрыт, хотя она есть в каталоге, указанном в path. В этом случае можно переформировать hash-таблицу либо «выйдя и войдя» в систему, либо с помощью команды rehash.
Имеется третий тип переменных (кроме обычных и специальных) - переменные окружения. Их роль такова. Имеется фиксированный набор имен переменных, которые, вообще говоря, являются переменными в обычном смысле (могут принимать значения, участвуют в выражениях), но кроме того обладают замечательной особенностью. При формировании любого процесса, кроме командной строки ему передаются значения этих переменных. Именно такие переменные называются переменными окружения. Программа может оперировать с этими переменными. (Конкретные имена переменных Вы посмотрите сами.)
Специальные файлы
Любой командный язык имеет набор т.н. профайлов, или стартовых файлов. CSH имеет две разновидности этих файлов: это файлы, которые могут выполняться при старте CSH, и файлы, которые выполняются при завершении работы.
При старте CSH работает с двумя файлами - .cshrc и .login. Файл .cshrc - это командный файл, в котором пользователь по своему усмотрению может размещать произвольное количество команд на CSH, которые будут выполняться сразу после запуска CSH (например, в этом файле может находиться команда тестирования файловой системы и т.д.). Файл .login запускается при входе пользователя в систему. В этом файле также может находиться любая последовательность команд, например там может быть переопределение имен команд, наиболее приемлемое для данного пользователя (потому что мнемоника команд в UNIX достаточно тяжелая, да и параметров у каждой команды много) или установка тех или иных режимов работы (пример, ignoreeof - игнорирование попытки завершения сеанса работы по нажатию Ctrl-D).
При завершении работы с CSH запускается файл с именем .logout в котором также может находиться некоторый набор команд.
Есть стандартный файл, который может образоваться в процессе работы - это файл .history. Если у вас определена возможность сохранения истории, то как раз в этом файле буферизуется предыстория вашей работы.
Это все, что относится к командным языкам в части ОС UNIX. А теперь я уточню те аспекты этой темы, с которыми Вы должны разобраться самостоятельно, используя доступную литературу:
-
Основные возможности интерпретатора команд (любого: CHS или BASH). Командная строка, структура команды, специальные символы, метасимволы.
-
Группирование команд. Работа с журналом команд. История/предистория сеанса пользователя.
-
Переменные CSH. Значения переменных. Построения выражений. Специальные переменные. Переменные окружения.
-
Язык программирования CHS, основные конструкции и правила интерпретации.
-
Встроенные команды CSH.
-
Специальные командные файлы.