Командный интерпретатор Shell.
Все совмещенные системы составляются по крайней мере с тремя командными интерпретаторами. Bourne shell (sh), c shell (csh) koru shell (ksh), существует еще несколько интерпретаторов например Bourn – Again shell (bash), со сходными функциями.
Командный интерпретатор, по существу, является первой программой с которой начинается работа пользователя. В UNIX реализуется следующий сценарий работы в системе:
1. При включении терминала активизируется процесс getty, который является сервером терминального доступа и запускает программу begin, которая, в свою очередь запрашивает у пользователя имя и пароль.
2. если пользователь зарегестрирован в системе и ввел правильный пароль, begin запустит программу, указанную в последнем поле записи пользователя в файле /etc/passwd. В принципе это может быть любая программа, но обычно это командный интерпретатор shell.
3. Shell выполняет соответствующий командный файл инициализации и выдает на терминал пользователя приглашение. С этого момента и пользователь может вводить команды.
4. Shell считываем ввод пользователя, производит синтаксический анализ введенной строки и выполняет действие, предписанное пользователем или сообщает об ошибке, если программа или функция не найдены.
5. По окончании работы пользователь завершает работу с интерпритатором, вводя команду exit, и выходит из системы.
Командный интерпритатор является удобным средством программирования.
С помощью Shell можно создавать сложные программы, конструируя их как из кирпичиков, из существующих утилит UNIX. Программы на языке Shell часто называют скриптами или сценариями (script). Интерпритатор считывает строки из файла - скрипта и выполняет их, как если бы они были введены пользователем в командной строке.
Как уже упоминалось, при входе пользователя в систему запускается его инициализационный скрипт, выполняющий несколько функций: установку пути поиска программ, инициализацию терминала, определение расположения почтового ящика. Помимо этого может быть выполнен целый ряд полезных действий, - например, установка приглашения.
Инициализационный скрипт находится в домашнем каталоге пользователя.
Для разных командных интерпретаторов используются различные скрипты инициализации:
Bourn Shell(sh) .profail
C Shell (csh) . login cshre
Korn Shell .profile Kshrc
Boupn Again Shell .profile bashre
Скрипты profile и login выполняются при первом входе в систему. Скрипы cshre, Kshrc и bashrc выполняются при каждом запуске интерпретатора.
Синтаксис языка Shell.
Скрипт представляет собой обычный текстовый файл в котором записаны инструкции, понятные командному интерпретатору. Это могут быть команды, выражения Shell или функции. Командный интерпретатор считывает эти инструкции из файла и последовательно выполняет их.
В Бурновском интерпретаторе (Bourne Shell) комментарии начинаются с символа #; комментарии могут занимать не всю строку, а следовать после команды.
Поскольку в системе могут существовать скрипты для различных интерпретаторов, имя интерпретирующей команды обычно помещается в первой строке следующим образом:
#! /bin/sh – здесь последующий текст скрипта будет интерпретироваться Bourne Shell
В командной строке или скрипте командного интерпретатора можно определить и использовать переменные. Значением переменной является строка, которая передается присвоением:
var = value, где var – имя переменной, а value – ее значение.
Значение переменной можно получить используя знак '$'. Например, вывести значение переменной name на экран можно с помощью команды echo следующим образом:
$ tcho $ name
Так же можно присвоить другой переменной name 1 значение переменной name
$ name 1= $ name
Значение переменной можно присвоить иначе. Поскольку представляем собой строку, shel представляем удобный способ генерации строк из потока вывода команды.
Синтаксис представления при этом следующий:
var = 'command'
Здесь var – имя переменной, а command – название команды.
Пример:
команда pwd выводит строку со значением текущего каталога
$ pwd
/usr/home/student
Можно присвоить переменной cdir значение текущего каталога, которое сохраняется в ней:
$ cdir = 'pwd'
$ echo $cdir
/usr/home/student
$ cd/usr/bin
$ pwd
/usr/bin
$ cd $ cdir
$ pwd
/usr/home/student
При использовании переменной, например var, командный интерпретатор подставляет вместо $ var ее значение. Более сложные синтаксические конструкции получения значения переменной следующие:
$ var | - значение var; ничего, если var не определена |
$ {var} | - тоже, но отделяет имя переменной var от последующих символов. |
$ {var: - string} | - значение var если определено; иначе -string |
$ {var:=string} | -тоже, но если var не определена, ей присваивается значение строки string |
$ {var: ? string} | -если var не определена выводится строка string и shell прекращает работу. |
$ {var: + string} | - Строка string, если var определена, в противном случае ничего |
несколько примеров:
$ var = user 1 $ var 1 = user 2 $ echo $ var 1 user 2 | $ echo ${var}1 user 11 $ echo $ {var 1:+ "hello"} hello |
Для нормальной работы UNIX ряд переменных должен быть определен. Некоторые наиболее употребительные переменные:
HOME | каталог верхнего уровня пользователя | /usr/student |
PATH | Поисковый путь | /bin:/etc:/usr/bin:. |
имя почтового ящика | /usr/spool/mail/student | |
TERM | имя терминала | ttpi |
PS1 | первичное применение shell | # |
PS2 | вторичное применение shel | > |
Переменная HOME в основном используется в команде cd, которая служит для перехода в каталог.
Вызов команды cd без параметра эквивалента следующему вызову:
$ cd $ HOME
который вернет систему в домашний каталог.
Переменная PATH служит для поиска командным интерпретатором запущенных на выполнение программ, если их имя не содержит пути.
Каталоги поиска в переменной PATH разделены символом ':'. Текущий каталог поиска должен быть задан явно ' . ', shell не производит поиск в текущем каталоге по умолчанию.
Переменная MAIL определяет местоположение почтового ящика, эту переменную используют программы работы с эквивалентной почтой.
Переменная TERM содержит имя терминала и используется программами для доступа к базе данных терминалов. Обычно это программы, обеспечивающие полноэкранный режим работы, цвета и системы меню (редакторы, различные пользовательские оболочки).
Переменные PS1 и PS2 устанавливают первичное и вторичное приглашение командного интерпретатора. Первичное приглашение указывает на готовность интерпретатора к вводу команд. Значение этой переменной имеет вид "$" для обычных пользователей и "#" для суперпользователя. Однако вид приглашения легко изменит, задав значение переменной PS1. Чтобы задать в приглашении домашней директории:
PS1 = 'home' " > "
тогда приглашение компьютера будет
Home\student >
Вторичное приглашение появляется, если нажать клавишу <Enter>, синтаксически не закончив ввод команды.
$while:
>do
>echo Привет!
>done
После этого слово "Привет", будет выводиться в бесконечном цикле. Выйти из этого можно <Ctrl>+<C> или <Del>.
Помимо переменных, определяемых явно, Shell имеет ряд внутренних переменных, значения которых устанавливаются самим интерпретатором.
$1, $2,…
$#, $?, $$,$!, $*, $@
основная область этих переменных – скрипты, они редко используются в командной строке.