Командные процессоры (оболочки) 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Командные процессоры (оболочки)



ЛАБОРАТОРНАЯ РАБОТА № 5

«Программирование в командном процессоре ОС UNIX»

Командные процессоры (оболочки)

Командные процессоры или оболочки – это программы, позволяющие пользователю взаимодействовать с компьютером. Их можно рассматривать как настоящие интерпретируемые языки, которые воспринимают команды пользователя и обрабатывают их. Поэтому командные процессоры также называют интерпретаторами команд. На языках оболочек можно писать программы и выполнять их подобно любым другим программам. UNIX обладает большим количеством оболочек. Наиболее популярными являются следующие четыре оболочки:

– оболочка Борна (Bourne) – первоначальная командная оболочка UNIX: базовый, но полный набор функций;

– С-оболочка – добавка университета Беркли к коллекции оболочек: она надстраивается над оболочкой Борна, используя С-подобный синтаксис команд, и сохраняет историю выполненных команд;

– оболочка Корна – напоминает оболочку С, но операторы управления программой совместимы с операторами оболочки Борна;

– BASH – сокращение от Bourne Again Shell (опять оболочка Борна), в основе своей совмещает свойства оболочек С и Корна (разработка компании Free Software Foundation).

 

Стандарт POSIX

 

POSIX (Portable Operating System Interface for Computer Environments) – интерфейс переносимой операционной системы для компьютерных сред. Представляет собой набор стандартов, подготовленных институтом инженеров по электронике и радиотехники (IEEE), который определяет различные аспекты построения операционной системы. POSIX включает такие темы, как программный интерфейс, безопасность, работа с сетями и графический интерфейс. POSIX-совместимые оболочки являются будущим поколением оболочек UNIX и других ОС. Windows NT рекламируется как система, удовлетворяющая POSIX-стандартам.

POSIX-совместимые оболочки разработаны на базе оболочки Корна; фонд бесплатного программного обеспечения (Free Software Foundation) работает над тем, чтобы и оболочку BASH сделать POSIX-совместимой.

Рассмотрим основные элементы программирования в оболочке bash. В других оболочках большинство команд будет совпадать с описанными ниже.

 

Использование арифметических вычислений. Операторы let и read

 

Оболочка bash поддерживает встроенные арифметические функции. Команда let является показателем того, что последующие аргументы представляют собой выражение, это единичный терм (term), обычно подлежащее вычислению. Простейшее выражение целочисленный.

Целые числа можно записывать как последовательность цифр или в любом базовом формате. Этот формат – radix#number, где radix (основание системы счисления) любое число не более 26. Для большинства команд основания систем счисления это – 2 (двоичная), 8 (восьмеричная) и 16 (шестнадцатеричная). Простейшими математическими выражениями являются сложение (+), вычитание (-), умножение (*), целочисленное деление (/) и целочисленный остаток (%). Команда let берет два операнда и присваивает их переменной.

Положительным моментом команды let можно считать то, что для идентификации переменной ей не нужен знак доллара; вы можете писать команды типа let sum=x+7, и let ищет переменную x и добавляет к ней 7. Команда let также расширяет другие выражения let, если они заключены в двойные круглые скобки. Таким способом вы можете создавать довольно сложные выражения. Команда let не ограничена простыми арифметическими выражениями. Табл.1 показывает полный набор let операций.

Таблица 1.

Командные файлы и функции

 

Последовательность команд может быть помещена в текстовый файл. Такой файл называется командным. Далее этот файл можно выполнить по команде

bash командный_файл [аргументы]

Чтобы не вводить каждый раз последовательности символов bash, необходимо изменить код защиты этого командного файла, обеспечив доступ к этому файлу по выполнению. Это может быть сделано с помощью команды

chmod +x имя_файла

Теперь можно вызывать свой командный файл на выполнение просто, вводя его имя с терминала так, как будто он является выполняемой программой. Командный процессор распознает, что в Вашем файле на самом деле хранится не выполняемая программа, а программа, написанная на языке программирования оболочки, и осуществит ее интерпретацию.

Группу команд можно объединить в функцию. Для этого существует ключевое слово function, после которого следует имя функции и список команд, заключенных в фигурные скобки. Удалить функцию можно с помощью команды unset c флагом -f.

Команда typeset имеет четыре опции для работы с функциями:

-f – перечисляет определенные на текущий момент функции;

-ft – при последующем вызове функции инициирует ее трассировку;

-fx – экспортирует все перечисленные функции в любые дочерние программы оболочек;

-fu – обозначает указанные функции как автоматически загружаемые. Автоматически загружаемые функции хранятся в командных файлах, а при их вызове оболочка просматривает переменную FPATH, отыскивая файл с одноименными именами функций, загружает его и вызывает эти функции.

 

Оператор цикла for

 

В обобщенной форме оператор цикла for выглядит следующим образом:

for имя [in список-значений]
do список-команд
done

При каждом следующем выполнении оператора цикла for переменная "имя" принимает следующее значение из списка значений, задаваемых списком "список-значений". Вообще говоря, "список-значений" является необязательным. При его отсутствии оператор цикла for выполняется для всех позиционных параметров или, иначе говоря, аргументов. Таким образом, оператор for i эквивалентен оператору for i in $*. Выполнение оператора цикла for завершается, когда "список-значений" будет исчерпан. Последовательность команд (операторов), задаваемая списком "список-команд", состоит из одной или более команд оболочки, отделенных друг от друга с помощью символов newline или;. Рассмотрим примеры использования оператора цикла for. В результате выполнения оператора

for A in alpha beta gamma
do echo A
done

на терминал будет выведено следующее:

alpha
beta
gamma

Предположим, что Вы хотите найти во всех файлах текущего каталога, содержащих исходные тексты программ, написанных на языке программирования Си, все вхождения функции с некоторым именем. Это можно сделать с помощью такой последовательности команд:

for i
do grep $i *.c
done

Поместив эту последовательность команд в файл findref, Вы сможете затем, используя команду

findref'hash(''insert(''symbol('

вывести на терминал все строки из всех файлов текущего каталога, имена которых оканчиваются символами.с, содержащие ссылки на функции hash(), insert() и symbol(). Использование символов' в вышеприведенном примере необходимо для снятия специального смысла с символа (.

 

Оператор выбора case

 

Оператор выбора case реализует возможность ветвления на произвольное число ветвей. Эта возможность обеспечивается в большинстве современных языков программирования, предполагающих использование структурного подхода. В обобщенной форме оператор выбора case выглядит следующим образом:

case имя in
шаблон1) список-команд;;
шаблон2) список-команд;;
...
esac

Выполнение оператора выбора case сводится к тому, что выполняется последовательность команд (операторов), задаваемая списком "список-команд", в строке, для которой значение переменной "имя" совпадает с "шаблоном". Поскольку метасимвол * соответствует произвольной, в том числе и пустой, последовательности символов, то его можно использовать в качестве "шаблона" в последней строке перед служебным словом esac. В этом случае реализуются все действия, которые необходимо произвести, если значение переменной "имя" не совпадает ни с одним из шаблонов, заданных в предшествующих строках.

Рассмотрим примеры использования оператора выбора case. В результате выполнения оператора

for A in alpha beta gamma
do case $A in
alpha) B=a;;
beta) В=с;;
gamma) В=e
esac
echo $B
done

на терминал будет выведено следующее:

a
c
e

 

Условный оператор if

 

В обобщенной форме условный оператор if выглядит следующим образом:

if список-команд
then список-команд
{elif список-команд
then список-команд}
[else список-команд]
fi

Выполнение условного оператора if сводится к тому, что сначала выполняется последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово if. Затем, если последняя выполненная команда из этой последовательности команд возвращает нулевой код завершения ("истина"), будет выполнена последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово then. Фраза elif проверяется в том случае, когда предыдущая проверка была ложной. Строка, содержащая служебное слово else, является необязательной. Если она присутствует, то последовательность команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово else, будет выполнена только при условии, что последняя выполненная команда из последовательности команд (операторов), которую задает "список-команд" в строке, содержащей служебное слово if или elif, возвращает ненулевой код завершения ("ложь"). Рассмотрим следующий пример:

for A in *
do if test -d $A
then echo $A: is a directory
else echo -n $A: is a file and
if test -w $A
then echo writeable
elif test -r $A
then echo readable
else echo neither readable nor writeable
fi
fi
done

Первая строка в приведенном выше примере обеспечивает выполнение всех последующих действий в цикле для всех имен файлов из текущего каталога, при этом переменная А на каждом шаге последовательно принимает значения, равные именам этих файлов. Первая содержащая служебное слово if строка проверяет, является ли файл, имя которого представляет собой текущее значение переменной А, каталогом. Если этот файл является каталогом, то на стандартный вывод выводятся имя этого файла и сообщение о том, что файл с указанным именем является каталогом. Эти действия в приведенном выше примере обеспечиваются в результате выполнения третьей строки.

Оставшиеся строки выполняются только в том случае, если проверка того, является ли файл, имя которого представляет собой текущее значение переменной А, каталогом, дает отрицательный ответ. Это означает, что файл, имя которого представляет собой текущее значение переменной А, является обычным файлом. Если этот файл является обычным файлом, то на стандартный вывод выводятся имя этого файла и сообщение о том, что файл с указанным именем является обычным файлом. Эти действия в приведенном выше примере обеспечиваются в результате выполнения четвертой строки. Особенностью использования команды echo в этой строке является использование флага -n, благодаря чему выводимая командой echo строка не будет дополнена символом newline (перевод строки), что позволяет впоследствии дополнить эту строку, как это, например, показано в приведенном выше примере. Вторая, содержащая служебное слово if, строка проверяет, доступен ли по записи файл, имя которого представляет собой текущее значение переменной А. Если этот файл доступен по записи, то строка дополняется соответствующим сообщением. Если же этот файл недоступен по записи, то проверяется, доступен ли этот файл по чтению. Эти действия в приведенном выше примере обеспечиваются в результате выполнения седьмой строки. Если этот файл доступен по чтению, то строка дополняется соответствующим сообщением. Если же этот файл недоступен ни по записи, ни по чтению, то строка также дополняется соответствующим сообщением. Эти действия в приведенном выше примере обеспечиваются в результате выполнения девятой строки.

 

Прерывание циклов

 

Два несложных способа позволяют вам прерывать циклы в оболочке bash. Команда break завершает выполнение цикла, а команда continue завершает данную итерацию блока операторов. Команда break полезна для завершения цикла while в ситуациях, когда условие перестает быть правильным. Пример бесконечного цикла while, с прерыванием в момент, когда файл перестает существовать:

while true
do
if [! -f $file]
then
break
fi
sleep 10
done

Команда continue используется в ситуациях, когда больше нет необходимости выполнять блок операторов, но вы можете захотеть продолжить проверять данный блок на других условных выражениях. Пример предназначен для игнорирования файла /dev/null в любом их списке:

while file=$filelist[$i]
(($i < ${#filelist[*]}))
do
if
[ "$file" == “dev/null"]
then
continue
fi
action
done

Эта программа пропускает нужное значение, но продолжает тестировать остальные.

В качестве еще одного примера командного файла приведем команду man. Если Вы уже использовали команду man, то у Вас могло создаться ошибочное впечатление, что эта команда реализована в виде выполняемой программы. Получить на терминале вариант команды man, используемый в Вашей версии ОС UNIX, можно по команде cat /bin/man или cat /usr/bin/man, сравните его с тем вариантом команды man, который приводится здесь:

cd /usr/man
:default nroff ($N), section 1 ($s)
N=n
s=1
for i
do case $i in
[1-9]) s=$i;;
-t) N=t;;
-n) N=n;;
-*) echo unknown flag \'$i\’;;
*) if test -f man$s/$i.$s
then ${N}roff man0/${N}aa man$s/$i.$s
else
:look through all manual sections
found = no
for j in 1 2 3 4 5 6 7 8 9
do if test -f man$j/$i.$j
then man $j $i
found = yes
fi
done
case $found in
no) echo “$i: manual page not found”
esac
fi
esac
done

 

ЗАДАНИЕ НА ЛАБОРАТОРНУЮ РАБОТУ

1. Используя команды getopts grep написать командный файл, который анализирует командную строку с ключами:

· -iinputfile – прочитать данные из указанного файла

· -ooutputfile – вывести данные в указанный файл

· -pшаблон – указать шаблон для поиска

· -С – различать большие и малые буквы

· -n – выдавать номера строк,

а затем ищет в указанном файле нужные строки, определяемые ключом -p.

2. Написать на языке Си программу, которая вводит строку символов и определяет, чем является эта строка – целым числом, вещественным, датой или текстовой строкой. Затем программа завершается с помощью функции exit(n), передавая информацию в о коде завершения в оболочку. Командный файл должен вызывать эту программу и, проанализировав с помощью команды $? код возврата, выдавать сообщение о том какое число было введено.

3. Написать пример командного файла, обрабатывающего более 10 входных аргументов.

4. Написать командный файл – аналог команды ls (без использования самой этой команды). Требуется, что бы он выдавал информацию о нужном каталоге и выводил информацию о возможностях доступа к файлам этого каталога.

5. Написать командный файл, реализующий упрощенный механизм семафоров. Командный файл должен в течение некоторого времени t1 дожидаться освобождения ресурса, выдавая об этом сообщение, а дождавшись его освобождения использовать его в течение некоторого времени t2<>t1, также выдавая информацию о том, что ресурс используется соответствующим командным файлом (процессом). Запустить командный файл в одном виртуальном терминале в фоновом режиме, перенаправив его вывод в другой (>/dev/tty#, где # – номер терминала куда перенаправляется вывод), в котором также запущен этот файл, но не фоновом, а в привилегированном режиме. Доработать программу так, чтобы имелась возможность взаимодействия трех и более процессов.

6. Реализовать команду man с помощью командного файла.

 

Контрольные вопросы

1.  Объясните понятие командных оболочек

2.  Что такое POSIX?

3.  Как определяются переменные и массивы в языке программирования bash?

4.  Каково назначение операторов let и read?

5.  Какие арифметические операции можно применять в языке программирования bash?

6.  Что означает операция (())?

7.  Какие стандартные имена переменных вы знаете?

8.  Что такое метасимволы?

9.  Как экранировать метасимволы?

10.  Как создать и запускать командные файлы?

11.  Как определяются функции в языке программирования Bash?

12.  Каким образом Вы можете выяснить является файл каталогом или обычным файлом?

13.  Каково назначение команд set, typset и unser?

14.  Как передаются параметры в командные файлы?

15.  Назовите специальные переменные языка bash и их назначение.

16.  Каково предназначение команды getopts?

17.  Какое отношение метасимволы имеют к генерации имен файлов?

18.  Какие операторы управления действиями Вы знаете?

19.  Какие операторы используются для прерывания цикла?

20.  Для чего нужны команды false и true?

21.  Что означает строка if test –f manSs/Si.Ss встреченная в командном файле?

ЛАБОРАТОРНАЯ РАБОТА № 5

«Программирование в командном процессоре ОС UNIX»

Командные процессоры (оболочки)

Командные процессоры или оболочки – это программы, позволяющие пользователю взаимодействовать с компьютером. Их можно рассматривать как настоящие интерпретируемые языки, которые воспринимают команды пользователя и обрабатывают их. Поэтому командные процессоры также называют интерпретаторами команд. На языках оболочек можно писать программы и выполнять их подобно любым другим программам. UNIX обладает большим количеством оболочек. Наиболее популярными являются следующие четыре оболочки:

– оболочка Борна (Bourne) – первоначальная командная оболочка UNIX: базовый, но полный набор функций;

– С-оболочка – добавка университета Беркли к коллекции оболочек: она надстраивается над оболочкой Борна, используя С-подобный синтаксис команд, и сохраняет историю выполненных команд;

– оболочка Корна – напоминает оболочку С, но операторы управления программой совместимы с операторами оболочки Борна;

– BASH – сокращение от Bourne Again Shell (опять оболочка Борна), в основе своей совмещает свойства оболочек С и Корна (разработка компании Free Software Foundation).

 

Стандарт POSIX

 

POSIX (Portable Operating System Interface for Computer Environments) – интерфейс переносимой операционной системы для компьютерных сред. Представляет собой набор стандартов, подготовленных институтом инженеров по электронике и радиотехники (IEEE), который определяет различные аспекты построения операционной системы. POSIX включает такие темы, как программный интерфейс, безопасность, работа с сетями и графический интерфейс. POSIX-совместимые оболочки являются будущим поколением оболочек UNIX и других ОС. Windows NT рекламируется как система, удовлетворяющая POSIX-стандартам.

POSIX-совместимые оболочки разработаны на базе оболочки Корна; фонд бесплатного программного обеспечения (Free Software Foundation) работает над тем, чтобы и оболочку BASH сделать POSIX-совместимой.

Рассмотрим основные элементы программирования в оболочке bash. В других оболочках большинство команд будет совпадать с описанными ниже.

 



Поделиться:


Последнее изменение этой страницы: 2021-01-14; просмотров: 545; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.17.174.239 (0.046 с.)