Файл: Лабораторная Linux №2.doc

ВУЗ: Не указан

Категория: Методичка

Дисциплина: Операционные системы

Добавлен: 20.10.2018

Просмотров: 1772

Скачиваний: 5

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

$ k1 && k2; k3

тогда команда k2 будет выполнена только при успешном завершении команды k1; после любого из результатов выполнения команды k2 будет выполнена команда k3.

Пример 3. Здесь обе команды k2 и k3 будут выполнены только при успешном завершении команды k1.

$ k1 && {k2; k3}

Пример 4. В фоновом режиме (&)будет выполняться последовательность команд k1 и k2: $ {k1; k2} &

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

Пример 5. Пусть пользователь находится в начальном каталоге /mnt/floppy/laba2. Последовательность команд: $ cd ..; ls; ls

выведет на терминал два экземпляра содержимого каталога /mnt/floppy, а последовательность тех же команд, но с группировкой круглыми скобками: $ (cd ..; ls) ls, тогда вывод на терминал будет следующий:

/mnt/floppy

/mnt/floppy/laba2

При входе в скобки вызывается новый экземпляр КИ, осуществляющий переход. При выходе из круглых скобок происходит возврат в старый КИ и в старый каталог.

Переменные командного интерпретатора

В командном интерпретаторе можно определять переменные. Они определяются на сеанс работы. Переменная описывается одним словом, которое может состоять из букв, цифр и символов, не зарезервированных командным интерпретатором для внутреннего использования.

Задание 3. Выполните следующие упражнения, назначив свои имена переменных, каталогов и файлов.

1. Переменной var1 присваивается значение english так:

$ var1=english

Обращение к переменной осуществляется через $ перед переменной, например, чтобы вывести значение этой переменной на экран, следует выполнить: $ echo $var1

2. Присвойте переменной значение одного из Ваших каталогов, например: $ var2=home/user/student/myx

и скопируйте из текущего каталога файл spisok2 в описанный в последней переменной: $ cp spisok2 $var2

3. Посмотрите, какие переменные описаны в этом сеансе работы:

$ set

4. Уберите установку второй переменной и проверьте, какие переменные остались: $ unset var2, $ set.

Выведется сообщение о наличии одной переменной var1.

5. Посмотрите содержимое Вашего рабочего каталога: $ ls -alf

Если переменная является частью какого-либо имени, то используются фигурные скобки.

Пример. Имя файла, используемого для загрузки модулей ядра: /etc/rc.d/rc.modules. Запишите в переменную имя каталога этого файла: a=/etc/rc.d/, тогда следующие команды равноценны:

$ cat /etc/rc.d/rc.modules,

$ cat ${a}rc.modules,

cat выдаст на экран содержимое одного и того же файла.

Командный язык командных интерпретаторов

Командный язык командных интерпретаторов часто называют shell, что в переводе означает: "раковина", "скорлупа". Shell - язык программирования очень высокого уровня. На этом языке пользователь осуществляет управление компьютером. Язык удобен для выполнения задач системного администрирования и сетевых задач.


После входа в режим терминала пользователь начинает взаимодействие с командной оболочкой. Признаком того, что оболочка готова к приему команд, служит выдаваемое на терминал приглашение к работе. Обычно это $ - знак "доллар" для обычного пользователя или # - знак "диез" для привилегированного пользователя. Основным элементом языка shell является команда. Shell стандартизован в стандарте мобильных систем POSIX. Его разновидности: язык cshell, kshell, bashell и другие. Каждый пользователь может создать свой командный язык.

Пользователь может одновременно работать на одном экземпляре операционной системы с разными командными языками. Первый shell вызывается автоматически при входе в систему и выдает на экран приглашение к работе. После этого можно вызывать на выполнение любые команды, в том числе и снова сам shell (команда sh - вызов интерпретатора shell), который создаст новую оболочку внутри прежней.

Сценарии командного интерпретатора
и создание собственных команд

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

Чтобы выполнить сценарий, следует задать команду:

$ sh имя_файла_сценария

Пример 1. Создать файл, включающий следующие команды:

mkdir katalsh

cp spisok1 ~/katalsh

cd katalsh

ls ..

more spisok1

Выполнить сценарий: $ sh szenf1, запись может быть и такой:

$ sh < szenf1

Команды файла выполнятся последовательно, в порядке их записи в файл. На экране появится список файлов текущего каталога, включая katalsh, потом первая страница содержимого файла spisok1.

Для файла сценария можно установить право на выполнение, указав полномочия в относительной форме:

$ chmod u+x szenf1, или указав полномочия в абсолютной форме:

$ chmod 755 szenf1

тогда файл сценария можно выполнить так: $ szenf1.

При наборе команды sh вызывается shell. Файл можно выполнить и в текущем экземпляре shell. Для этого существует специфическая команда . (знак "точка"): $ . szf2

Задание 4. Составьте свой файл сценария из известных Вам команд и выполните его описанными способами (без установки прав на выполнение и с установкой полномочий).


Переменные сценария

В сценариях можно устанавливать переменные, как это выполнялось это выше в командном интерпретаторе, можно использовать встроенные переменные, можно передавать параметры в сценарии.

Встроенные переменные описываются следующим образом: $1, $2, $3, $4, …, $9. Они являются позиционными: значения встроенных переменных передаются в сценарий в порядке их нумерации. Если используются значения переменных, которые назначили сами, то они передаются в сценарий в том порядке, в котором были назначены. Во избежание неоднозначности оба типа переменных в одном сценарии не рекомендуется использовать.


Пример. Создать файл сценария szf2 для просмотра на терминале файлов с указанным расширением, которое может быть различным при каждом новом запуске сценария. Текст файла следующий: ls *.$1

Найти файлы с раширением txt. Установить значение переменной $1 в данном случае txt. Выполнить файл сценария с передачей в него параметра txt: $ sh szf2 txt

здесь значение переменной указано после имени файла через пробел.

Создать файл сценария с текстом, включающим две переменные, для вывода списка файлов с указанным расширением и из любого указанного каталога: ls $1/*.$2

Теперь $1 - имя каталога, $2 - расширение. Выполнить файл:

$ sh szf2 usr doc

Задание 5. Создать сценарий поиска файлов с заданным расширением, задаваемым в командной строке.

Предложить хотя бы один способ ввода переменных сценария, если требуется найти файлы без расширения.

Найти в корневом каталоге точечные файлы (их имя начинается со знака "точка"), если известно, что второй символ имен таких файлов – строчный английский символ.

Комментарии и командные оболочки

Комментарии в файлах сценариев начинаются с символа "диез" -знак "решетка" (#). Поэтому нельзя начинать командные файлы с символа #., если в системе установлена оболочка C-Shell (csh), символ # будет интерпретирован как выполняемый в csh, в результате будет активизирован интерпретатор csh. Можно начать командный sh-файл с пустой строки или пустого оператора "двоеточие" (:), что часто можно встретить в сценариях серверов.

Поскольку ОС UNIX и ОС Linux - системы многопользовательские, то в них можно работать параллельно на нескольких терминалах, даже если они находятся на одном компьютере, (переход с терминал на терминал осуществляется нажатием ALT/функциональная клавиша), имея на каждом экране нового или одного и того же пользователя со своей командной оболочкой. Можно в графическом режиме открыть большое число окон, а в каждом окне может быть свой пользователь со своей командной оболочкой.

Иногда необходимо, чтобы все фоновые процессы завершились, прежде чем будет выполняться какой-то сценарий. Для этого служит специальная команда wait [PID]. Эта команда ждет завершения указанного идентификатором фонового процесса. Если команда не имеет параметра, то она ждет завершения всех фоновых процессов, дочерних для данного sh. Фоновые процессы сложно уничтожить. Для уничтожения фонового процесса нужно знать его номер. При запуске фонового процесса на экран выдается число, соответствующее номеру (идентификатору PID) этого процесса. Номер также можно узнать с помощью команды ps с опциями aux, позволяющими получить перечень всех процессов: $ ps -aux

В выведенной на экран таблице будут находиться: перечень идентификаторов процессов (PID), имена пользователей, текущее время, затраченное процессами, и т.д. В выведенной таблице можно найти номера процессов, подлежащих уничтожению, например, это 649 и 844.


Тогда командой, прекращающей выполнение процессов:

$ kill -9 649 844

можно уничтожить эти процессы. Важно, что при уничтожении процессов пользователь должен иметь то же имя пользователя, под которым была задана команда создания процессов, или иметь имя привилегированного пользователя.

Команда test ([ ])

Команда test проверяет выполнение некоторого условия и часто используется при построении сценариев в языке shell. С использованием этой встроенной в КИ команды, позволяющей сравнивать две или несколько величин, формируются операторы выбора и цикла. Существует два возможных формата команды:

test условие

или другая форма записи

[ условие ]

Если использовать второй вариант записи, то вместо того, чтобы писать перед условием слово test, следует заключать условие в скобки. Shell будет распознавать эту команду по открывающей скобке [, как слову, соответствующему команде test. Между скобками и содержащимся в них условием обязательно должны быть пробелы. Пробелы также должны быть между значениями и символом сравнения или операции, но при присвоении значений переменным пробелы не ставятся.

Условия

Команда test использует условия различных типов.

Условия сравнения целых чисел:

x -eq y - "x" равно "y";

x -ne y - "x" не равно "y";

x -gt y - "x" больше "y";

x -ge y - "x" больше или равно "y";

x -lt y - "x" меньше "y";

x -le y - "x" меньше или равно "y".

Условия проверки файлов:

-f file - файл file является обычным файлом;

-d file - файл file - каталог;

-с file - файл file - специальный файл;

-r file - имеется разрешение на чтение файла file;

-w file - имеется разрешение на запись в файл file;

-s file - файл file не пустой.

Условия проверки строк:

str1 = str2 - строки str1 и str2 совпадают;

str1 != str2 - строки str1 и str2 не совпадают;

-n str1 - строка str1 существует (непустая);

-z str1 строка str1 не существует (пустая).

Логические операции:

! - (not) инвертирует значение кода завершения;

-o - (or) соответствует логическому ИЛИ;

-a - (and) соответствует логическому И.

Пример 1. Условия проверки файлов. Вводить с клавиатуры командные строки, в первом случае будет получено подтверждение (код завершения 0), а во втором ‑ опровержение (код завершения 1). file1 - имя существующего файла. Проверить работу команды test, используя файлы рабочего каталога.

[ -f file1 ] ; echo $?

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

0

[ -d file1 ] ; echo $?

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

1

Пример 2. Сравнение переменных КИ. Далее следует набранная в командной строке команда и результат вывода на экран:

x="text"; export x; [ "text" = "$x" ]; echo $?

0

x=abc ; export x ; [ abc = "$x" ] ; echo $?

0

При выполнении команда echo выдает на терминал все написанное правее ее. Команда export делает переменную х доступной для других сценариев.

Пример 3. Команда test дает значение истина (код завершения 0) в случае, если в скобках стоит непустое слово.

[ true ] ; echo $?

0

[ ] ; echo $?

1

Пример 4. Существуют два стандартных значения условия, которые могут использоваться вместо условия. Это логические значения "истина ‑ "true и "ложь" ‑ false. Скобки для этого не нужны.


true ; echo $?

0

false ; echo $?

1

Пример 5. Условия сравнения целых чисел. В данном случае команда test воспринимает строки символов как целые числа, поскольку в условии стоит -eq. Команда и результат ее выполнения:

x=abc ; export x ; [ abc -eq "$x" ] ; echo $?

"[": integer expression expected before -eq

Во всех остальных случаях нулевому значению соответствует пустая строка. Если надо обнулить переменную, например x, это достигается присваиванием x=0. Команда и результат ее выполнения:

x=321 ; export x ; [ 321 -eq "$x" ] ; echo $?

0

x=3.21 ; export x ; [ 3.21 -eq "$x" ] ; echo $?

"[": integer expression expected before -eq

x=321 ; export x ; [ 123 -lt "$x" ] ; echo $?

0

Пример 6. Логические условия реализуются с помощью символов, используемых в языке С++ и других языках программирования высокого уровня. Команда и результат ее выполнения:

[ ! text ] ; echo $?

1

x=priem; export x; [ "$x" -f file1 -o priem ] ; echo $?

0

x=""; export x; [ "$x" -a -f file1 -o ! privet ] ; echo $?

1

Встроенные переменные сценариев

Для передачи параметров в сценарии используются позиционные переменные (см. стр.38), которые вводятся в командной строке после имени команды со всеми ее опциями и параметрами через пробел: $1,$2,...,$n ‑ позиционные параметры, переданные сценарию.

В сценариях КИ bash используются встроенные переменные, представляющие специальные символы-шаблоны, подстановку которых при встрече в исполняемом сценарии производит bash. Встроенными переменными сценариев являются следующие:

$0 ‑ название сценария (имя файла сценария);

$# ‑ количество позиционных параметров, переданных сценарию;

$? ‑ код возврата последнего процесса;

$$ ‑ номер (PID) текущего процесса;

$! ‑ PID последнего запущенного в фоновом режиме процесса (асинхронного);

$@ - список позиционных параметров, переданных сценарию;

$* ‑ все позиционные параметры, слитые в единую строку и записываемые через разделитель полей, по умолчанию ‑ пробел ($1 $2 $3 $n).

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

В общем случае оператор if имеет следующую структуру:

if условие then список

[elif условие then список ]

[else список ]

fi

Здесь elif сокращенный вариант от else if, он может быть использован наряду с полным, допускается вложение произвольного числа операторов if, а также и других операторов).

Конструкции

[elif условие then список команд ]

[else список команд ]

не являются обязательными (здесь для указания на необязательности конструкций использованы квадратные скобки ‑ не путать с квадратными скобками команды test). Минимальная структура этого оператора следующая:

if условие

then список команд

fi

Если выполнено условие (получен код завершения 0), то выполняется список команд, иначе он пропускается. Структура обязательно завершается служебным словом fi. Количество fi всегда должно соответствовать количеству if.

Пример 1. Пусть написан файл-сценарий fs1:

if [ $1 -gt $2 ]

then pwd

else echo $0 : Hello IVAN!

fi

Тогда выполнение сценария и результат:

$ fs1 12 11 даст

/home/student/IVAN

а выполнение $ fs1 12 13

даст результат:

fs1: Hello IVAN!

Пример 2. Выдача командами различных кодов завершения. Пусть сценарий fs2 будет следующий: