Командный интерпретатор 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:.
MAIL имя почтового ящика /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,…

$#, $?, $$,$!, $*, $@

основная область этих переменных – скрипты, они редко используются в командной строке.

Наши рекомендации