Библиотека сайта rus-linux.net
Что такое оболочка?
Взаимодействие оболочки и ядра
Функции и свойства оболочки
Почти любое используемое человеком изобретение обладает интерфейсом, посредствам которого осуществляется взаимодействие. Сидите ли вы в седле или на месте кучера в двуколке, в кабине управления самолетом или за клавишами фортепьяно, в любом случае вы выполняете различные действия для достижения желаемого эффекта. Интерфейсом для UNIX служит оболочка, являющаяся программным уровнем, который обеспечивает среду для ввода команд и параметров для получения желаемого результата. Как и в случае любого человеческого изобретения, чем больше знаний и опыта имеется в отношении данного предмета, тем лучшего результата можно достичь.
Для удовлетворения различных потребностей в UNIX существуют различные оболочки. В настоящей главе рассматриваются следующие темы:
р Способ взаимодействия оболочек с пользователями и с UNIX
р Свойства оболочки
р Управление средой оболочки
Взаимодействие ядра и оболочки
Когда система UNIX переводится в интерактивный режим, программа unix (ядро системы) загружается в основную память компьютера, где остается до выключения компьютера. Во время процесса загрузки программа init выполняется в качестве фоновой задачи и продолжает выполняться до выключения. Эта программа сканирует файл /etc/inittab, в котором перечисляются порты, имеющие терминалы, и их характеристики. Когда эта программа активна и открытый терминал найден, init вызывает программу getty, которая вызывает на монитор терминала приглашение login:. Когда этот процесс вызван и выполняется, пользователь может начинать взаимодействовать с системой.
Вызовы оболочки UNIX при входе в систему
На рис. 8.1 показано протекание процесса от загрузки ядра до входа в оболочку. С этого момента пользователь находится в активной оболочке и готов к вводу команд в систему.
Во время входа в систему после ввода имени пользователя программа getty выводит на монитор приглашение password:. После ввода пароля программа getty вызывает программу login, которая просматривает файл /etc/passwd на предмет соответствующих записей. Если соответствие установлено, login осуществляет переход к начальному каталогу пользователя и передает управление программе начального запуска сеанса; и имя пользователя, и пароль определяются записью в файле /etc/passwd. Хотя это может зависеть от программы приложения, например, после проведения пароля может загрузится конкретное приложение, управляемое меню, обычно программа начального запуска сеанса является командным интерпретатором, как /bin/sh оболочки Bourne.
Затем программа оболочки считывает файлы /etc/profile и .profile, которые устанавливают параметры, характерные для всей системы и для конкретного пользователя. После этого оболочка выводит приглашение на ввод команд, подобное $.
При выходе из оболочки ядро возвращает управление программе init, которая перезапускает процесс входа в систему. Прерывание может выполняться одним из двух способов: посредством команды exit или когда ядро вызывает команду kill применительно к процессу оболочки. При прерывании ядро освобождает все ресурсы, использовавшиеся пользователем и программой оболочки.
Оболочка и дочерние процессы
В системе UNIX существует много уровней программ, начиная с ядра и заканчивая конкретным приложением или командой. Взаимосвязь между этими уровнями показана на рис. 8.2.
После завершения процесса входа в систему уровень программы оболочки (уровень командного интерпретатора) непосредственно взаимодействует с ядром, как показано на рис. 8.2. При вводе команды, например, $ ls, оболочка находит файл программы /bin/ls и передает его ядру для исполнения. Ядро выделяет память для нового дочернего процесса, загружает программу и выполняет инструкции, содержащиеся в /bin/ls. По завершении программы ядро освобождает выделенную процессу память и возвращает управление родительской программе оболочки. Для ознакомления с примером такого процесса введите следующую команду:
$ps
В результате выводится перечень выполняющихся в данный момент команд: профамма оболочки и программа ps. Теперь введите следующее:
$sleep 10 & $ps
Первая команда создает дочерний процесс sleep, подлежащий выполнению в фоновом режиме, который отображается посредством команды ps. При каждом вводе команды создается дочерний процесс, который выполняется независимо от родительского процесса или оболочки. Это оставляет родительский процесс неизменным при выполнении другой задачи.
Автоматическое выполнение оболочки
Некоторые ресурсы UNIX, например сгоn, могут запускать программу оболочки без вмешательства пользователя. При использовании этого свойства пользователю нужно в первой строке файла с кодом программы указать оболочку, которую необходимо запустить, например, так:
#! /bin/sh
Эта строка определяет оболочку Bourne.
Необходимо также переназначить любой вывод, поскольку ни один терминал не связан с автоматическим выполнением. Это описывается далее в этой главе в разделе "Обработка файлов: переназначение ввода/вывода и каналы".
Функции и свойства оболочки
Какую бы оболочку вы ни выбрали, все они имеют одно и то же назначение р предоставить пользователю интерфейс к UNIX. С этой целью все оболочки обладают некоторыми общими характеристиками:
Интерпретация командной строки
Зарезервированные слова
Метасимволы оболочки (шаблоны)
Доступ к командам программы и их исполнение
Обработка файлов: переназначение ввода/вывода и каналы
Поддержка переменных
Управлением средой
Программирование оболочки
Интерпретация командной строки
При входе в систему запускается специальная версия оболочки, называемая интерактивной оболочкой, отображается приглашение оболочки, обычно в форме знака доллара ($), процента (%) или фунта (#). При вводе строки в ответ на это приглашение оболочка пытается интерпретировать ее. Ввод в ответ на приглашение оболочки иногда называют командной строкой. Основной формат командной строки выглядит следующим образом:
команда аргументы
Команда р это исполняемая команда UNIX, программа, утилита или программа оболочки. Аргументы передаются исполняемому модулю. Большинство программ утилит UNIX ожидают, что аргументы будут иметь следующую форму:
опции имена файлов Например, в командной строке
$ 1з -1 filel file2
имеется три аргумента команды ls; первый является опцией, а последние два ~ именами файлов.
Одно из действий, выполняемых оболочкой для ядра р исключение необязательной информации. Так, применительно к компьютеру одним из типов необязательной информации являются пробелы; следовательно, важно знать, что делает оболочка, встречая пробел. Пробелами являются символы пробелов, горизонтальной табуляции и символы новой строки. Давайте рассмотрим следующий пример:
$ echo Part a Part В Part С
Part A Part В Part С
В данном случае оболочка интерпретирует командную строку как команду echo, имеющую шесть аргументов, и удаляет пробелы между ними. Например, при печати заголовков отчета и при необходимости сохранить пробелы, нужно было бы заключить данные в символы кавычек, как в следующем примере:
$ echo 'Part A Part В Part С'
Part A PartB Part С
Символ одинарных кавычек мешает оболочке заглядывать внутрь кавычек. Теперь оболочка интерпретирует эту строку как команду echo с единственным аргументом, который в данном случае является строкой символов, содержащей пробелы.
Зарезервированные слова
Все версии оболочек имеют слова, обладающие специальным значением. При программировании оболочек такие слова, как do, done, for и while обеспечивают управление циклом, a if, then, else fi - условиями. Каждая версия оболочки обладает различными зарезервированными словами, присущими именно ей.
Метасимволы оболочки (шаблоны)
Все версии оболочек поддерживают метасимволы, которые дают возможность указывать имена файлов. Шаблоны приводятся ниже:
Шаблоны Описание
* Соответствие любой части
? Соответствие любому символу
[] Соответствие диапазону приведенных символов
Шаблоны могут быть удобны при обработке ряда специфичных файлов. Ниже приведен ряд примеров:
$ ls t* Эта команда выводит перечень всех файлов, чьи имена начинаются с t.
$ls test?5.dat
Эта команда выводит перечень всех файлов, имена которых начинаются с test, далее следует любой одиночный символ, а затем р 5*dat.
$ls [a-c]* Эта команда выводит перечень всех файлов, имена которых начинаются с символов от а до с.
$ls [e,m,t]*
В результате выполнения этой команды отображается список всех файлов, имена которых начинаются с е, m или t.
Команды программ
При вводе команды оболочка считывает переменную среды $path, содержащую список каталогов с файлами программ. Оболочка просматривает этот набор каталогов, отыскивая файл программы, соответствующий команде. Затем оболочка передает ядру действительное имя файла.
Обработка файлов: переправления ввода/вывода и каналы
В предшествовавших главах были описаны стандартные ввод и вывод. Большинство команд UNIX принимают ввод с клавиатуры терминала и отправляют вывод на его дисплей, если иное не указано аргументами. Для переназначения вывода в файл используется символ >. Например, команда
$ls > myfiles
выводит список файлов текущего каталога и помещает его в файл, названный myfiles. Аналогично можно переназначить ввод с помощью символа <р Например, команда
$wc -l < myfiles
осуществляет ввод в команду we из файла myfiles. Хотя такой же результат можно было бы получить, использовав имя файла в качестве аргумента, необходимость в переназначении ввода становится более очевидной при программировании оболочки.
Для направления вывода одной команды во ввод следующей можно использовать символ | (канал). Например, команда
$1s -s | -nr I pg
выдает список файлов текущего каталога и их размер в блоках, направляет вывод в команду sort, которая упорядочивает файлы в порядке уменьшения номеров, а затем направляет вывод в команду формирования страниц pg для окончательного отображения на мониторе терминала. Команда канала р одно из наиболее используемых инструментальных средств при создании конструкций команд.
Подстановка команд
Подстановка команд аналогична переназначению, за исключением того, что она используется для получения аргументов команды из вывода другой команды. Например, команда
$ grep 'wc -l myfiles' *
берет число строк в файле myfiles из команды we и помещает это число в качестве аргумента в команду grep для отыскания в текущем каталоге всех файлов, соответствующих этому критерию.
Поддержка переменных
Оболочка может поддерживать переменные. Переменные р это области памяти, в которых можно хранить данные для последующего использования. Значение переменной присваивается с помощью знака равенства (=):
$ LOOKUP=/usr/mydir
В этой строке оболочка устанавливает LOOKUP в качестве переменной и присваивает ей значение /usr/ mydir. В дальнейшем можно использовать значение, сохраненное в LOOKUP, в командной строке, предваряя имя переменной знаком доллара ($). Рассмотрите следующие примеры:
$ echo $LOOKUP
/usr/mydir
$ echo $ LOOKUP
LOOKUP
Чтобы сделать переменную доступной дочерним процессам, можно использовать команду export, например:
$ LOOKUP=/usr/mydir
$export LOOKUP
ПРИМЕЧАНИЕ Присвоение значений переменным в оболочке С отличается от выполнения этого в оболочках Воurn и Коrn. Для присвоения переменной в оболочке С используется команда set % set LOOKUP= /usr/mydir Обратите внимание, что знак равенства с обеих сторон выделяется пробелами |
Подобно подстановке имени файла подстановка имени переменной происходит до вызова программы. Во втором примере знак доллара ($) опущен. Следовательно, оболочка просто передает строку команде echo в качестве аргумента. При подстановке имени переменной значение переменной замещает имя переменной.
Например, в строке
$ Is $LOOKUP/filename
программа ls вызывается с единственным аргументом /usr/mydir/filcname.
Запуск оболочки р управление средой
Когда пользователь начинает сеанс работы с UNIX и запускается оболочка, оболочка создает для пользователя специфичную среду. Этот процесс описывается в последующих разделах.
Переменные среды оболочки
Когда программа login вызывает оболочку, она устанавливает переменные среды, которые считываются из файлов инициализации оболочки /etc/profile и .profile. Обычно эти файлы устанавливают тип терминала в переменной $TERM и путь по умолчанию для исполняемых файлов р в переменной SPATH. Посмотрите следующие примеры:
$ echo $TERM $
echo $PATH
Переменные легко можно изменить так же, как присваиваются значения любой переменной оболочки.
ПРИМЕЧАНИЕ Оболочка С присваивает значения переменным среды посредством команды setenv % setenv TERM vt100 |
Файлы начального запуска оболочки
Файл .profile р локальный файл начального запуска для оболочки Bourne. Оболочка Коrn использует файл .kshrc, а оболочка С р файл .cshrc. Для манипулирования средой начального запуска эти файлы можно редактировать. При необходимости можно добавлять дополнительные переменные. Можно также добавлять программирование оболочки для получения установок среды, зависящих от различных условий.
Опции начального запуска оболочки
При вызове оболочки из /etc/passwd или из командной строки, несколько опций можно устанавливать в качестве аргументов программы оболочки. Например, оболочка Bourne имеет опцию -х, которая перед исполнением отображает команды и их аргументы. Это удобно при отладке программы оболочки. Все эти опции подробно описываются в последующих главах.
Программирование оболочки
Было показано, что оболочка используется для интерпретации командных строк, поддержки переменных и исполнения программ. Вместе с тем оболочка является языком программирования. Набор команд оболочки можно хранить в файле. Этот файл называется сценарием оболочки или программированием оболочки. Объединяя команды и присвоение переменных с управлением потоком и принятием решений, можно получить мощное инструментальное средство программирования. Используя оболочку в качестве языка программирования, можно автоматизировать повторяющиеся задачи, писать отчеты и создавать и манипулировать файлами данных. В остальных главах части II программирование оболочек рассматривается подробней.
Резюме
Оболочка обеспечивает интерфейс между пользователем и основой UNIX р ядром. Оболочка интерпретирует командные строки в качестве ввода, осуществляет подстановку имен файлов и переменных, переназначает ввод и вывод, отыскивает исполняемые файлы, инициирует и взаимодействует с программами. Оболочка создает дочерние процессы и может управлять их выполнением. Оболочка поддерживает переменные среды каждого пользователя. Кроме того, оболочка является мощным языком программирования.